/ Hex Artifact Content
Login

Artifact 8e82108846bb8ad0651feb1672eb8aae82158b6240f5677bc72d6cdf80e9d7a8:


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 72 65 74 75 72 6e 20 70 45  .  }.  return pE
0930: 78 70 72 2d 3e 61 66 66 45 78 70 72 3b 0a 7d 0a  xpr->affExpr;.}.
0940: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
0950: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0960: 65 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  e for expression
0970: 20 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65   pExpr to be the
0980: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
0990: 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20  quence named by 
09a0: 70 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e  pToken.   Return
09b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
09c0: 6e 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74 68  new Expr node th
09d0: 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  at.** implements
09e0: 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   the COLLATE ope
09f0: 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
0a00: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
0a10: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
0a20: 2c 20 74 68 61 74 20 66 61 63 74 20 69 73 20 72  , that fact is r
0a30: 65 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72 73  ecorded in pPars
0a40: 65 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65  e->db.** and the
0a50: 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
0a60: 20 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e 63   is returned unc
0a70: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  hanged..*/.Expr 
0a80: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0a90: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50  ollateToken(.  P
0aa0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
0ab0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
0ac0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0ad0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
0ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
0af0: 74 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c  the "COLLATE" cl
0b00: 61 75 73 65 20 74 6f 20 74 68 69 73 20 65 78 70  ause to this exp
0b10: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ression */.  con
0b20: 73 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e  st Token *pCollN
0b30: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
0b40: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
0b50: 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  nce */.  int deq
0b60: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
0b70: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71    /* True to deq
0b80: 75 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a  uote pCollName *
0b90: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  /.){.  if( pColl
0ba0: 4e 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  Name->n>0 ){.   
0bb0: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
0bc0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
0bd0: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f  Parse->db, TK_CO
0be0: 4c 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65  LLATE, pCollName
0bf0: 2c 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20 20  , dequote);.    
0c00: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0c10: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
0c20: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
0c30: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43  w->flags |= EP_C
0c40: 6f 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a  ollate|EP_Skip;.
0c50: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
0c60: 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ew;.    }.  }.  
0c70: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0c80: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
0c90: 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
0ca0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
0cb0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f   Expr *pExpr, co
0cc0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20  nst char *zC){. 
0cd0: 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65   Token s;.  asse
0ce0: 72 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73  rt( zC!=0 );.  s
0cf0: 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
0d00: 26 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a  &s, (char*)zC);.
0d10: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
0d20: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f  ExprAddCollateTo
0d30: 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  ken(pParse, pExp
0d40: 72 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  r, &s, 0);.}../*
0d50: 0a 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e  .** Skip over an
0d60: 79 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65  y TK_COLLATE ope
0d70: 72 61 74 6f 72 73 2e 0a 2a 2f 0a 45 78 70 72 20  rators..*/.Expr 
0d80: 2a 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70  *sqlite3ExprSkip
0d90: 43 6f 6c 6c 61 74 65 28 45 78 70 72 20 2a 70 45  Collate(Expr *pE
0da0: 78 70 72 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  xpr){.  while( p
0db0: 45 78 70 72 20 26 26 20 45 78 70 72 48 61 73 50  Expr && ExprHasP
0dc0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0dd0: 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20 20 20 61  P_Skip) ){.    a
0de0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
0df0: 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a  ==TK_COLLATE );.
0e00: 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70      pExpr = pExp
0e10: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 20 20 20  r->pLeft;.  }   
0e20: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
0e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20 6f  .}../*.** Skip o
0e40: 76 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c 41  ver any TK_COLLA
0e50: 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 6e 64  TE operators and
0e60: 2f 6f 72 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79  /or any unlikely
0e70: 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68  ().** or likelih
0e80: 6f 6f 64 28 29 20 6f 72 20 6c 69 6b 65 6c 79 28  ood() or likely(
0e90: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 74 20 74  ) functions at t
0ea0: 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 0a 2a 2a  he root of an.**
0eb0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
0ec0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
0ed0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c  rSkipCollateAndL
0ee0: 69 6b 65 6c 79 28 45 78 70 72 20 2a 70 45 78 70  ikely(Expr *pExp
0ef0: 72 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 45 78  r){.  while( pEx
0f00: 70 72 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  pr && ExprHasPro
0f10: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0f20: 53 6b 69 70 7c 45 50 5f 55 6e 6c 69 6b 65 6c 79  Skip|EP_Unlikely
0f30: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70  ) ){.    if( Exp
0f40: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
0f50: 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29  pr, EP_Unlikely)
0f60: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
0f70: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
0f80: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
0f90: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
0fa0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0fb0: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  x.pList->nExpr>0
0fc0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0fd0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
0fe0: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
0ff0: 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d    pExpr = pExpr-
1000: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
1010: 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Expr;.    }else{
1020: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1030: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1040: 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70 45  LATE );.      pE
1050: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  xpr = pExpr->pLe
1060: 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20  ft;.    }.  }   
1070: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
1080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1090: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
10a0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
10b0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
10c0: 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73  . If.** there is
10d0: 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c   no defined coll
10e0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20  ating sequence, 
10f0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
1100: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c  ** See also: sql
1110: 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
1120: 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  q().**.** The sq
1130: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
1140: 65 71 28 29 20 77 6f 72 6b 73 20 74 68 65 20 73  eq() works the s
1150: 61 6d 65 20 65 78 61 63 74 20 74 68 61 74 20 69  ame exact that i
1160: 74 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  t returns the.**
1170: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
1180: 6f 6e 20 69 66 20 70 45 78 70 72 20 68 61 73 20  on if pExpr has 
1190: 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61  no defined colla
11a0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
11b0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
11c0: 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74 65  ce might be dete
11d0: 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c  rmined by a COLL
11e0: 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  ATE operator.** 
11f0: 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65 6e  or by the presen
1200: 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77  ce of a column w
1210: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63 6f  ith a defined co
1220: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1230: 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65  ..** COLLATE ope
1240: 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72 73  rators take firs
1250: 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 4c  t precedence.  L
1260: 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61 6b  eft operands tak
1270: 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20  e.** precedence 
1280: 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72 61  over right opera
1290: 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  nds..*/.CollSeq 
12a0: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
12b0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
12c0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
12d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12e0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43   pParse->db;.  C
12f0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1300: 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70  0;.  Expr *p = p
1310: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  Expr;.  while( p
1320: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
1330: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20   p->op;.    if( 
1340: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
1350: 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
1360: 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41     if( (op==TK_A
1370: 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d  GG_COLUMN || op=
1380: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70  =TK_COLUMN || op
1390: 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20 20  ==TK_TRIGGER).  
13a0: 20 20 20 26 26 20 70 2d 3e 79 2e 70 54 61 62 21     && p->y.pTab!
13b0: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
13c0: 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  /* op==TK_REGIST
13d0: 45 52 20 26 26 20 70 2d 3e 79 2e 70 54 61 62 21  ER && p->y.pTab!
13e0: 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  =0 happens when 
13f0: 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69 6e  pExpr was origin
1400: 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20  ally.      ** a 
1410: 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61  TK_COLUMN but wa
1420: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76 61  s previously eva
1430: 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68 65  luated and cache
1440: 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 20  d in a register 
1450: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  */.      int j =
1460: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
1470: 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20     if( j>=0 ){. 
1480: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1490: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 79 2e  r *zColl = p->y.
14a0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43  pTab->aCol[j].zC
14b0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  oll;.        pCo
14c0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
14d0: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
14e0: 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a  db), zColl, 0);.
14f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1500: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
1510: 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 7c  f( op==TK_CAST |
1520: 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29  | op==TK_UPLUS )
1530: 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70  {.      p = p->p
1540: 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f 6e 74  Left;.      cont
1550: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
1560: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  if( op==TK_COLLA
1570: 54 45 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  TE ){.      pCol
1580: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
1590: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e  llSeq(pParse, EN
15a0: 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a  C(db), 0, p->u.z
15b0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
15c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
15d0: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
15e0: 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  _Collate ){.    
15f0: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26    if( p->pLeft &
1600: 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  & (p->pLeft->fla
1610: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
1620: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
1630: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
1640: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1650: 20 20 45 78 70 72 20 2a 70 4e 65 78 74 20 20 3d    Expr *pNext  =
1660: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20   p->pRight;.    
1670: 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e      /* The Expr.
1680: 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72  x union is never
1690: 20 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d   used at the sam
16a0: 65 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70  e time as Expr.p
16b0: 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20  Right */.       
16c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c   assert( p->x.pL
16d0: 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ist==0 || p->pRi
16e0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
16f0: 20 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20 68 6f    /* p->flags ho
1700: 6c 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65 20 61  lds EP_Collate a
1710: 6e 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  nd p->pLeft->fla
1720: 67 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20 41 6e  gs does not.  An
1730: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e  d.        ** p->
1740: 78 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e 6f 74  x.pSelect cannot
1750: 2e 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e 70 4c  .  So if p->x.pL
1760: 65 66 74 20 65 78 69 73 74 73 2c 20 69 74 20 6d  eft exists, it m
1770: 75 73 74 20 68 6f 6c 64 20 61 74 0a 20 20 20 20  ust hold at.    
1780: 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e 65      ** least one
1790: 20 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54 68 75   EP_Collate. Thu
17a0: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
17b0: 74 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f 0a 20  two ALWAYS. */. 
17c0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 2e         if( p->x.
17d0: 70 4c 69 73 74 21 3d 30 20 0a 20 20 20 20 20 20  pList!=0 .      
17e0: 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f     && !db->mallo
17f0: 63 46 61 69 6c 65 64 0a 20 20 20 20 20 20 20 20  cFailed.        
1800: 20 26 26 20 41 4c 57 41 59 53 28 21 45 78 70 72   && ALWAYS(!Expr
1810: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
1820: 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20  P_xIsSelect)).  
1830: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1840: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1850: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57      for(i=0; ALW
1860: 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74  AYS(i<p->x.pList
1870: 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a  ->nExpr); i++){.
1880: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1890: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18a0: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
18b0: 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61  .pExpr, EP_Colla
18c0: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  te) ){.         
18d0: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
18e0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
18f0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
1900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1920: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1930: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
1940: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1950: 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  se{.      break;
1960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1970: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
1980: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f  lSeq(pParse, pCo
1990: 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c  ll) ){ .    pCol
19a0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
19b0: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
19c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
19d0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19e0: 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
19f0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a  sion pExpr. If.*
1a00: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  * there is no de
1a10: 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20  fined collating 
1a20: 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e  sequence, return
1a30: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1a40: 65 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f 6c  e.** defautl col
1a50: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
1a60: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
1a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1a80: 53 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Seq().**.** The 
1a90: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1aa0: 65 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f 72  eq() routine wor
1ab0: 6b 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  ks the same exce
1ac0: 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72 65  pt that it.** re
1ad0: 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
1ae0: 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65  ere is no define
1af0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  d collation..*/.
1b00: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
1b10: 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50 61  ExprNNCollSeq(Pa
1b20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1b30: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c  r *pExpr){.  Col
1b40: 6c 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74 65  lSeq *p = sqlite
1b50: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1b60: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 69  rse, pExpr);.  i
1b70: 66 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70 50  f( p==0 ) p = pP
1b80: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
1b90: 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  oll;.  assert( p
1ba0: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1bb0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
1bc0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 74  rn TRUE if the t
1bd0: 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 68  wo expressions h
1be0: 61 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ave equivalent c
1bf0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1c00: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
1c10: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74  e3ExprCollSeqMat
1c20: 63 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ch(Parse *pParse
1c30: 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70  , Expr *pE1, Exp
1c40: 72 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c 53  r *pE2){.  CollS
1c50: 65 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71 6c  eq *pColl1 = sql
1c60: 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
1c70: 71 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b 0a  q(pParse, pE1);.
1c80: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1c90: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e  2 = sqlite3ExprN
1ca0: 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  NCollSeq(pParse,
1cb0: 20 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e 20   pE2);.  return 
1cc0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1cd0: 43 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70 43  Coll1->zName, pC
1ce0: 6f 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 3b  oll2->zName)==0;
1cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1d00: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
1d10: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1d20: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
1d30: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1d40: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
1d50: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
1d60: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1d70: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
1d80: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1d90: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
1da0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
1db0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
1dc0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1dd0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
1de0: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
1df0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
1e00: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1e10: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
1e20: 61 66 66 31 3e 53 51 4c 49 54 45 5f 41 46 46 5f  aff1>SQLITE_AFF_
1e30: 4e 4f 4e 45 20 26 26 20 61 66 66 32 3e 53 51 4c  NONE && aff2>SQL
1e40: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
1e50: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
1e60: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
1e70: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
1e80: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
1e90: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
1ea0: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
1eb0: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
1ec0: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
1ed0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1ee0: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
1ef0: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
1f00: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1f10: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
1f20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f30: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
1f40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1f50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1f60: 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BLOB;.    }.  }
1f70: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65  else{.    /* One
1f80: 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d   side is a colum
1f90: 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  n, the other is 
1fa0: 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c  not. Use the col
1fb0: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a  umns affinity. *
1fc0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66  /.    assert( af
1fd0: 66 31 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f1<=SQLITE_AFF_N
1fe0: 4f 4e 45 20 7c 7c 20 61 66 66 32 3c 3d 53 51 4c  ONE || aff2<=SQL
1ff0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a  ITE_AFF_NONE );.
2000: 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31      return (aff1
2010: 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  <=SQLITE_AFF_NON
2020: 45 20 3f 20 61 66 66 32 20 3a 20 61 66 66 31 29  E ? aff2 : aff1)
2030: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   | SQLITE_AFF_NO
2040: 4e 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  NE;.  }.}../*.**
2050: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
2060: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
2070: 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70    Return the typ
2080: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
2090: 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70  should.** be app
20a0: 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65  lied to both ope
20b0: 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64  rands prior to d
20c0: 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69  oing the compari
20d0: 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  son..*/.static c
20e0: 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  har comparisonAf
20f0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
2100: 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b  pr){.  char aff;
2110: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
2120: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70  ->op==TK_EQ || p
2130: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
2140: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
2150: 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LT ||.         
2160: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
2170: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
2180: 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GE || pExpr->
2190: 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20  op==TK_LE ||.   
21a0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
21b0: 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72  ==TK_NE || pExpr
21c0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70  ->op==TK_IS || p
21d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
21e0: 4f 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OT );.  assert( 
21f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a  pExpr->pLeft );.
2200: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45    aff = sqlite3E
2210: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
2220: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  r->pLeft);.  if(
2230: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
2240: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
2250: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
2260: 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ty(pExpr->pRight
2270: 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20  , aff);.  }else 
2280: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
2290: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
22a0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
22b0: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
22c0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
22d0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
22e0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
22f0: 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  r, aff);.  }else
2300: 20 69 66 28 20 61 66 66 3d 3d 30 20 29 7b 0a 20   if( aff==0 ){. 
2310: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
2320: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20  AFF_BLOB;.  }.  
2330: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
2340: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
2350: 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65  comparison expre
2360: 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20  ssion, eg. '=', 
2370: 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63  '<', IN(...) etc
2380: 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74  ..** idx_affinit
2390: 79 20 69 73 20 74 68 65 20 61 66 66 69 6e 69 74  y is the affinit
23a0: 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  y of an indexed 
23b0: 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74  column. Return t
23c0: 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e  rue.** if the in
23d0: 64 65 78 20 77 69 74 68 20 61 66 66 69 6e 69 74  dex with affinit
23e0: 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d  y idx_affinity m
23f0: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  ay be used to im
2400: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63  plement.** the c
2410: 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78  omparison in pEx
2420: 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pr..*/.int sqlit
2430: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
2440: 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  k(Expr *pExpr, c
2450: 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79  har idx_affinity
2460: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  ){.  char aff = 
2470: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
2480: 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28  ty(pExpr);.  if(
2490: 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f   aff<SQLITE_AFF_
24a0: 54 45 58 54 20 29 7b 0a 20 20 20 20 72 65 74 75  TEXT ){.    retu
24b0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
24c0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
24d0: 54 45 58 54 20 29 7b 0a 20 20 20 20 72 65 74 75  TEXT ){.    retu
24e0: 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  rn idx_affinity=
24f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
2500: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
2510: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
2520: 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66 69  ffinity(idx_affi
2530: 6e 69 74 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nity);.}../*.** 
2540: 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61  Return the P5 va
2550: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
2560: 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69  be used for a bi
2570: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  nary comparison.
2580: 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71  ** opcode (OP_Eq
2590: 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73  , OP_Ge etc.) us
25a0: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45  ed to compare pE
25b0: 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e  xpr1 and pExpr2.
25c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69  .*/.static u8 bi
25d0: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78  naryCompareP5(Ex
25e0: 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72  pr *pExpr1, Expr
25f0: 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75   *pExpr2, int ju
2600: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20  mpIfNull){.  u8 
2610: 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69  aff = (char)sqli
2620: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
2630: 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d  pExpr2);.  aff =
2640: 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70   (u8)sqlite3Comp
2650: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
2660: 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a  r1, aff) | (u8)j
2670: 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  umpIfNull;.  ret
2680: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
2690: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
26a0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
26b0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
26c0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
26d0: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
26e0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
26f0: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
2700: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
2710: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
2720: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
2730: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
2740: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
2750: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
2760: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
2770: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
2780: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
2790: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
27a0: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
27b0: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
27c0: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
27d0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
27e0: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
27f0: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   type..**.** Arg
2800: 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75  ument pRight (bu
2810: 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79  t not pLeft) may
2820: 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   be a null point
2830: 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
2840: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63  ,.** it is not c
2850: 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f  onsidered..*/.Co
2860: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69  llSeq *sqlite3Bi
2870: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
2880: 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eq(.  Parse *pPa
2890: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c  rse, .  Expr *pL
28a0: 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52  eft, .  Expr *pR
28b0: 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  ight.){.  CollSe
28c0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65  q *pColl;.  asse
28d0: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69  rt( pLeft );.  i
28e0: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
28f0: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
2900: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2910: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2920: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
2930: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
2940: 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c  t && (pRight->fl
2950: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
2960: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  )!=0 ){.    pCol
2970: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2980: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2990: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
29a0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
29b0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
29c0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
29d0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
29e0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
29f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2a00: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
2a10: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
2a20: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
2a30: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2a40: 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61  code for a compa
2a50: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
2a60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
2a70: 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72  deCompare(.  Par
2a80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
2a90: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61  * The parsing (a
2aa0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
2ab0: 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ng) context */. 
2ac0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
2ad0: 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f     /* The left o
2ae0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
2af0: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a   *pRight,     /*
2b00: 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   The right opera
2b10: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f  nd */.  int opco
2b20: 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  de,       /* The
2b30: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f   comparison opco
2b40: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c  de */.  int in1,
2b50: 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67   int in2, /* Reg
2b60: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70  ister holding op
2b70: 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20  erands */.  int 
2b80: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
2b90: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72   Jump here if tr
2ba0: 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  ue.  */.  int ju
2bb0: 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49  mpIfNull    /* I
2bc0: 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20  f true, jump if 
2bd0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
2be0: 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  s NULL */.){.  i
2bf0: 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64  nt p5;.  int add
2c00: 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34  r;.  CollSeq *p4
2c10: 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65  ;..  p4 = sqlite
2c20: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2c30: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2c40: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
2c50: 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61  p5 = binaryCompa
2c60: 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67  reP5(pLeft, pRig
2c70: 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ht, jumpIfNull);
2c80: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
2c90: 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72  3VdbeAddOp4(pPar
2ca0: 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64  se->pVdbe, opcod
2cb0: 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e  e, in2, dest, in
2cc0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
2ce0: 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c  oid*)p4, P4_COLL
2cf0: 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  SEQ);.  sqlite3V
2d00: 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72  dbeChangeP5(pPar
2d10: 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70  se->pVdbe, (u8)p
2d20: 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  5);.  return add
2d30: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
2d40: 72 6e 20 74 72 75 65 20 69 66 20 65 78 70 72 65  rn true if expre
2d50: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61  ssion pExpr is a
2d60: 20 76 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73   vector, or fals
2d70: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
2d80: 2a 2a 20 41 20 76 65 63 74 6f 72 20 69 73 20 64  ** A vector is d
2d90: 65 66 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78  efined as any ex
2da0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65  pression that re
2db0: 73 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20  sults in two or 
2dc0: 6d 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  more.** columns 
2dd0: 6f 66 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72  of result.  Ever
2de0: 79 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65  y TK_VECTOR node
2df0: 20 69 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65   is an vector be
2e00: 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72  cause the.** par
2e10: 73 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e  ser will not gen
2e20: 65 72 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f  erate a TK_VECTO
2e30: 52 20 77 69 74 68 20 66 65 77 65 72 20 74 68 61  R with fewer tha
2e40: 6e 20 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  n two entries..*
2e50: 2a 20 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43  * But a TK_SELEC
2e60: 54 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65  T might be eithe
2e70: 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20  r a vector or a 
2e80: 73 63 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e  scalar. It is on
2e90: 6c 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  ly.** considered
2ea0: 20 61 20 76 65 63 74 6f 72 20 69 66 20 69 74 20   a vector if it 
2eb0: 68 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  has two or more 
2ec0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a  result columns..
2ed0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2ee0: 70 72 49 73 56 65 63 74 6f 72 28 45 78 70 72 20  prIsVector(Expr 
2ef0: 2a 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72  *pExpr){.  retur
2f00: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  n sqlite3ExprVec
2f10: 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31  torSize(pExpr)>1
2f20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
2f30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  e expression pas
2f40: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
2f50: 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74  argument is of t
2f60: 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a  ype TK_VECTOR .*
2f70: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * return the num
2f80: 62 65 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ber of expressio
2f90: 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72  ns in the vector
2fa0: 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70  . Or, if the exp
2fb0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  ression.** is a 
2fc0: 73 75 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75  sub-select, retu
2fd0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2fe0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2ff0: 73 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a  sub-select. For.
3000: 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70  ** any other typ
3010: 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c  e of expression,
3020: 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e   return 1..*/.in
3030: 74 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  t sqlite3ExprVec
3040: 74 6f 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45  torSize(Expr *pE
3050: 78 70 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20  xpr){.  u8 op = 
3060: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
3070: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
3080: 20 29 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f   ) op = pExpr->o
3090: 70 32 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  p2;.  if( op==TK
30a0: 5f 56 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72  _VECTOR ){.    r
30b0: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70  eturn pExpr->x.p
30c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
30d0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
30e0: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65  SELECT ){.    re
30f0: 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53  turn pExpr->x.pS
3100: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
3110: 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Expr;.  }else{. 
3120: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
3130: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3140: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
3150: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  subexpression of
3160: 20 70 56 65 63 74 6f 72 20 74 68 61 74 20 69 73   pVector that is
3170: 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c   the i-th.** col
3180: 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f  umn of the vecto
3190: 72 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72  r (numbered star
31a0: 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54  ting with 0).  T
31b0: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a  he caller must.*
31c0: 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 20  * ensure that i 
31d0: 69 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  is within range.
31e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
31f0: 72 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63  r is really a sc
3200: 61 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61  alar (and "scala
3210: 72 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73  r" here includes
3220: 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74   subqueries.** t
3230: 68 61 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e  hat return a sin
3240: 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65  gle column!) the
3250: 6e 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72  n return pVector
3260: 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a   unmodified..**.
3270: 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61 69  ** pVector retai
3280: 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  ns ownership of 
3290: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 75 62  the returned sub
32a0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
32b0: 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f 72 20  * If the vector 
32c0: 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e  is a (SELECT ...
32d0: 29 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  ) then the expre
32e0: 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69  ssion returned i
32f0: 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78  s.** just the ex
3300: 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65  pression for the
3310: 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68   i-th term of th
3320: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e  e result set, an
3330: 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20  d may.** not be 
3340: 72 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61  ready for evalua
3350: 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65  tion because the
3360: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61   table cursor ha
3370: 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65  s not yet.** bee
3380: 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f  n positioned..*/
3390: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65  .Expr *sqlite3Ve
33a0: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
33b0: 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20  (Expr *pVector, 
33c0: 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74  int i){.  assert
33d0: 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56  ( i<sqlite3ExprV
33e0: 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f  ectorSize(pVecto
33f0: 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  r) );.  if( sqli
3400: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
3410: 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20  pVector) ){.    
3420: 61 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d  assert( pVector-
3430: 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74  >op2==0 || pVect
3440: 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  or->op==TK_REGIS
3450: 54 45 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70  TER );.    if( p
3460: 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53  Vector->op==TK_S
3470: 45 4c 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72  ELECT || pVector
3480: 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54  ->op2==TK_SELECT
3490: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
34a0: 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c   pVector->x.pSel
34b0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  ect->pEList->a[i
34c0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c  ].pExpr;.    }el
34d0: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
34e0: 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73   pVector->x.pLis
34f0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
3500: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3510: 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a  n pVector;.}../*
3520: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  .** Compute and 
3530: 72 65 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70  return a new Exp
3540: 72 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77  r object which w
3550: 68 65 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a  hen passed to.**
3560: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
3570: 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  () will generate
3580: 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63   all necessary c
3590: 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a  ode to compute.*
35a0: 2a 20 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20  * the iField-th 
35b0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65  column of the ve
35c0: 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ctor expression 
35d0: 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  pVector..**.** I
35e0: 74 20 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63  t is ok for pVec
35f0: 74 6f 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c  tor to be a scal
3600: 61 72 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69  ar (as long as i
3610: 46 69 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20  Field==0).  .** 
3620: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
3630: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
3640: 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
3650: 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  rDup()..**.** Th
3660: 65 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68  e caller owns th
3670: 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72 20  e returned Expr 
3680: 6f 62 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65  object and is re
3690: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a  sponsible for.**
36a0: 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
36b0: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
36c0: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74  e eventually get
36d0: 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  s freed..**.** T
36e0: 68 65 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e  he caller retain
36f0: 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70  s ownership of p
3700: 56 65 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63  Vector.  If pVec
3710: 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45  tor is a TK_SELE
3720: 43 54 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  CT,.** then the 
3730: 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20  returned object 
3740: 77 69 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70  will reference p
3750: 56 65 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56  Vector and so pV
3760: 65 63 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69  ector must remai
3770: 6e 0a 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74  n.** valid for t
3780: 68 65 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72  he life of the r
3790: 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20  eturned object. 
37a0: 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61   If pVector is a
37b0: 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72   TK_VECTOR.** or
37c0: 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
37d0: 73 69 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61  sion, then it ca
37e0: 6e 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20  n be deleted as 
37f0: 73 6f 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75  soon as this rou
3800: 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e  tine.** returns.
3810: 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74  .**.** A trick t
3820: 6f 20 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c  o cause a TK_SEL
3830: 45 43 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62  ECT pVector to b
3840: 65 20 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68  e deleted togeth
3850: 65 72 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72  er with.** the r
3860: 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a  eturned Expr obj
3870: 65 63 74 20 69 73 20 74 6f 20 61 74 74 61 63 68  ect is to attach
3880: 20 74 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20   the pVector to 
3890: 74 68 65 20 70 52 69 67 68 74 20 66 69 65 6c 64  the pRight field
38a0: 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72  .** of the retur
38b0: 6e 65 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  ned TK_SELECT_CO
38c0: 4c 55 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74  LUMN Expr object
38d0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
38e0: 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46  e3ExprForVectorF
38f0: 69 65 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70  ield(.  Parse *p
3900: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
3910: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
3920: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
3930: 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  or,       /* The
3940: 20 76 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f   vector.  List o
3950: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72  f expressions or
3960: 20 61 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f   a sub-SELECT */
3970: 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20  .  int iField   
3980: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
3990: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76   column of the v
39a0: 65 63 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20  ector to return 
39b0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52  */.){.  Expr *pR
39c0: 65 74 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f  et;.  if( pVecto
39d0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
39e0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
39f0: 70 56 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26  pVector->flags &
3a00: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b   EP_xIsSelect );
3a10: 0a 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53  .    /* The TK_S
3a20: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70  ELECT_COLUMN Exp
3a30: 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20  r node:.    **. 
3a40: 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20     ** pLeft:    
3a50: 20 20 20 20 20 20 20 70 56 65 63 74 6f 72 20 63         pVector c
3a60: 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c  ontaining TK_SEL
3a70: 45 43 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65  ECT.  Not delete
3a80: 64 2e 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74  d..    ** pRight
3a90: 3a 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75  :          not u
3aa0: 73 65 64 2e 20 20 42 75 74 20 72 65 63 75 72 73  sed.  But recurs
3ab0: 69 76 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20  ively deleted.. 
3ac0: 20 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20     ** iColumn:  
3ad0: 20 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20         Index of 
3ae0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63  a column in pVec
3af0: 74 6f 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c  tor.    ** iTabl
3b00: 65 3a 20 20 20 20 20 20 20 20 20 20 30 20 6f 72  e:          0 or
3b10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
3b20: 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48  olumns on the LH
3b30: 53 20 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65  S of an assignme
3b40: 6e 74 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d  nt.    ** pLeft-
3b50: 3e 69 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74  >iTable:   First
3b60: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
3b70: 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
3b80: 20 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20   result, or 0.  
3b90: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
3ba0: 20 20 20 20 20 20 69 66 20 74 68 65 20 72 65 73        if the res
3bb0: 75 6c 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63  ult is not yet c
3bc0: 6f 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  omputed..    **.
3bd0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78      ** sqlite3Ex
3be0: 70 72 44 65 6c 65 74 65 28 29 20 73 70 65 63 69  prDelete() speci
3bf0: 66 69 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68  fically skips th
3c00: 65 20 72 65 63 75 72 73 69 76 65 20 64 65 6c 65  e recursive dele
3c10: 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65  te of.    ** pLe
3c20: 66 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f  ft on TK_SELECT_
3c30: 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42  COLUMN nodes.  B
3c40: 75 74 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c  ut pRight is fol
3c50: 6c 6f 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f  lowed, so pVecto
3c60: 72 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20  r.    ** can be 
3c70: 61 74 74 61 63 68 65 64 20 74 6f 20 70 52 69 67  attached to pRig
3c80: 68 74 20 74 6f 20 63 61 75 73 65 20 74 68 69 73  ht to cause this
3c90: 20 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77   node to take ow
3ca0: 6e 65 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a  nership of.    *
3cb0: 2a 20 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69  * pVector.  Typi
3cc0: 63 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c  cally there will
3cd0: 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f   be multiple TK_
3ce0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f  SELECT_COLUMN no
3cf0: 64 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  des.    ** with 
3d00: 74 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70  the same pLeft p
3d10: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56  ointer to the pV
3d20: 65 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20  ector, but only 
3d30: 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  one of them.    
3d40: 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20  ** will own the 
3d50: 70 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  pVector..    */.
3d60: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
3d70: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
3d80: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
3d90: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
3da0: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70   pRet ){.      p
3db0: 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69  Ret->iColumn = i
3dc0: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65  Field;.      pRe
3dd0: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74  t->pLeft = pVect
3de0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
3df0: 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c  sert( pRet==0 ||
3e00: 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30   pRet->iTable==0
3e10: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
3e20: 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70   if( pVector->op
3e30: 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56  ==TK_VECTOR ) pV
3e40: 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d  ector = pVector-
3e50: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65  >x.pList->a[iFie
3e60: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  ld].pExpr;.    p
3e70: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
3e80: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
3e90: 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20   pVector, 0);.  
3ea0: 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
3eb0: 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65  okenRemap(pParse
3ec0: 2c 20 70 52 65 74 2c 20 70 56 65 63 74 6f 72 29  , pRet, pVector)
3ed0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3ee0: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Ret;.}../*.** If
3ef0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
3f00: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
3f10: 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65  SELECT, generate
3f20: 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
3f30: 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75 72 6e 20  e.** it. Return 
3f40: 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20  the register in 
3f50: 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c 74  which the result
3f60: 20 69 73 20 73 74 6f 72 65 64 20 28 6f 72 2c 20   is stored (or, 
3f70: 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73  if the .** sub-s
3f80: 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 6d 6f  elect returns mo
3f90: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
3fa0: 6d 6e 2c 20 74 68 65 20 66 69 72 73 74 20 69 6e  mn, the first in
3fb0: 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20   an array.** of 
3fc0: 72 65 67 69 73 74 65 72 73 20 69 6e 20 77 68 69  registers in whi
3fd0: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ch the result is
3fe0: 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a 2a 20   stored)..**.** 
3ff0: 49 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20  If pExpr is not 
4000: 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70 72  a TK_SELECT expr
4010: 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 30  ession, return 0
4020: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4030: 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63  exprCodeSubselec
4040: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
4050: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4060: 20 69 6e 74 20 72 65 67 20 3d 20 30 3b 0a 23 69   int reg = 0;.#i
4070: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4080: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
4090: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
40a0: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 67  ELECT ){.    reg
40b0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
40c0: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
40d0: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 23 65 6e 64  pExpr);.  }.#end
40e0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b  if.  return reg;
40f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
4100: 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74  nt pVector point
4110: 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78  s to a vector ex
4120: 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65  pression - eithe
4130: 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  r a TK_VECTOR.**
4140: 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68   or TK_SELECT th
4150: 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  at returns more 
4160: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e  than one column.
4170: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4180: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65  eturns.** the re
4190: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66  gister number of
41a0: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
41b0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
41c0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  lue of.** elemen
41d0: 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20  t iField of the 
41e0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  vector..**.** If
41f0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
4200: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
4210: 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  on, then code fo
4220: 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a  r it must have .
4230: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4240: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
4250: 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73  the exprCodeSubs
4260: 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e  elect() routine.
4270: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
4280: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65   parameter regSe
4290: 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74  lect should be t
42a0: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
42b0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
42c0: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s.** containing 
42d0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
42e0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a  he sub-select. .
42f0: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
4300: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
4310: 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65  ECTOR, then code
4320: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
4330: 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67  ed field.** is g
4340: 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69  enerated. In thi
4350: 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65  s case (*pRegFre
4360: 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  e) may be set to
4370: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
4380: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  * a temporary re
4390: 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65  gister to be fre
43a0: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
43b0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
43c0: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
43d0: 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75  returning, outpu
43e0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70  t parameter (*pp
43f0: 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20  Expr) is set to 
4400: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4410: 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72  Expr object corr
4420: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65  esponding to ele
4430: 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68  ment iElem of th
4440: 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61  e vector..*/.sta
4450: 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74  tic int exprVect
4460: 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  orRegister(.  Pa
4470: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4490: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
44a0: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
44b0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
44c0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f      /* Vector to
44d0: 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74   extract element
44e0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
44f0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
4500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4510: 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66  eld to extract f
4520: 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20  rom pVector */. 
4530: 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20   int regSelect, 
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
4560: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4570: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
4580: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
4590: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70       /* OUT: Exp
45a0: 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20  ression element 
45b0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72  */.  int *pRegFr
45c0: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
45d0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d       /* OUT: Tem
45e0: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
45f0: 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70  ee */.){.  u8 op
4600: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a   = pVector->op;.
4610: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
4620: 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54  _VECTOR || op==T
4630: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70  K_REGISTER || op
4640: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
4650: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
4660: 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45  STER ){.    *ppE
4670: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63  xpr = sqlite3Vec
4680: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
4690: 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29  pVector, iField)
46a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 65  ;.    return pVe
46b0: 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69  ctor->iTable+iFi
46c0: 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  eld;.  }.  if( o
46d0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
46e0: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56      *ppExpr = pV
46f0: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
4700: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65  ->pEList->a[iFie
4710: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ld].pExpr;.     
4720: 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74  return regSelect
4730: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a  +iField;.  }.  *
4740: 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72  ppExpr = pVector
4750: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
4760: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65  eld].pExpr;.  re
4770: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
4780: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
4790: 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72   *ppExpr, pRegFr
47a0: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ee);.}../*.** Ex
47b0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
47c0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  s a comparison b
47d0: 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f  etween two vecto
47e0: 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74  r values. Comput
47f0: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
4800: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4810: 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c  n (1, 0, or NULL
4820: 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  ) and write that
4830: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  .** result into 
4840: 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a  register dest..*
4850: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4860: 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65  must satisfy the
4870: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f   following preco
4880: 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  nditions:.**.** 
4890: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
48a0: 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d  =TK_IS:      op=
48b0: 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53  =TK_EQ and p5==S
48c0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
48d0: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
48e0: 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d  =TK_ISNOT:   op=
48f0: 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53  =TK_NE and p5==S
4900: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
4910: 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20     otherwise:   
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d               op=
4930: 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70  =pExpr->op and p
4940: 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76  5==0.*/.static v
4950: 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f  oid codeVectorCo
4960: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
4970: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
4980: 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  * Code generator
4990: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
49a0: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
49b0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
49c0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
49d0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
49e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
49f0: 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
4a00: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4a10: 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20  /.  u8 op,      
4a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
4a30: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4a40: 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4a60: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20  QLITE_NULLEQ or 
4a70: 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  zero */.){.  Vdb
4a80: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4a90: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c  Vdbe;.  Expr *pL
4aa0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
4ab0: 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft;.  Expr *pRig
4ac0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
4ad0: 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20  ht;.  int nLeft 
4ae0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
4af0: 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
4b00: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4b10: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e  egLeft = 0;.  in
4b20: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
4b30: 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20    u8 opx = op;. 
4b40: 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20   int addrDone = 
4b50: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4b60: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20  abel(pParse);.. 
4b70: 20 69 66 28 20 6e 4c 65 66 74 21 3d 73 71 6c 69   if( nLeft!=sqli
4b80: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
4b90: 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  e(pRight) ){.   
4ba0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4bb0: 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61  (pParse, "row va
4bc0: 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20  lue misused");. 
4bd0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
4be0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
4bf0: 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78  op==TK_EQ || pEx
4c00: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20  pr->op==TK_NE . 
4c10: 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
4c20: 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78  op==TK_IS || pEx
4c30: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
4c40: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70   .       || pExp
4c50: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op==TK_LT || 
4c60: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  pExpr->op==TK_GT
4c70: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70   .       || pExp
4c80: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op==TK_LE || 
4c90: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45  pExpr->op==TK_GE
4ca0: 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28   .  );.  assert(
4cb0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c   pExpr->op==op |
4cc0: 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
4cd0: 5f 49 53 20 26 26 20 6f 70 3d 3d 54 4b 5f 45 51  _IS && op==TK_EQ
4ce0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ).            ||
4cf0: 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   (pExpr->op==TK_
4d00: 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d 54 4b 5f  ISNOT && op==TK_
4d10: 4e 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NE) );.  assert(
4d20: 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d   p5==0 || pExpr-
4d30: 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20 61 73 73  >op!=op );.  ass
4d40: 65 72 74 28 20 70 35 3d 3d 53 51 4c 49 54 45 5f  ert( p5==SQLITE_
4d50: 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78 70 72 2d  NULLEQ || pExpr-
4d60: 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20 20 70 35  >op==op );..  p5
4d70: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54 4f 52 45   |= SQLITE_STORE
4d80: 50 32 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d 54  P2;.  if( opx==T
4d90: 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20 54 4b 5f  K_LE ) opx = TK_
4da0: 4c 54 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d 54  LT;.  if( opx==T
4db0: 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20 54 4b 5f  K_GE ) opx = TK_
4dc0: 47 54 3b 0a 0a 20 20 72 65 67 4c 65 66 74 20 3d  GT;..  regLeft =
4dd0: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
4de0: 63 74 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  ct(pParse, pLeft
4df0: 29 3b 0a 20 20 72 65 67 52 69 67 68 74 20 3d 20  );.  regRight = 
4e00: 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63  exprCodeSubselec
4e10: 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  t(pParse, pRight
4e20: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 31  );..  for(i=0; 1
4e30: 20 2f 2a 4c 6f 6f 70 20 65 78 69 74 73 20 62 79   /*Loop exits by
4e40: 20 22 62 72 65 61 6b 22 2a 2f 3b 20 69 2b 2b 29   "break"*/; i++)
4e50: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 46 72 65  {.    int regFre
4e60: 65 31 20 3d 20 30 2c 20 72 65 67 46 72 65 65 32  e1 = 0, regFree2
4e70: 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 72 20 2a   = 0;.    Expr *
4e80: 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 69 6e  pL, *pR; .    in
4e90: 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 61 73  t r1, r2;.    as
4ea0: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
4eb0: 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20 72 31 20  nLeft );.    r1 
4ec0: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
4ed0: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65  ster(pParse, pLe
4ee0: 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c 20  ft, i, regLeft, 
4ef0: 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29 3b  &pL, &regFree1);
4f00: 0a 20 20 20 20 72 32 20 3d 20 65 78 70 72 56 65  .    r2 = exprVe
4f10: 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61  ctorRegister(pPa
4f20: 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69 2c 20  rse, pRight, i, 
4f30: 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c 20 26  regRight, &pR, &
4f40: 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 63  regFree2);.    c
4f50: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
4f60: 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c 20  e, pL, pR, opx, 
4f70: 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 70 35  r1, r2, dest, p5
4f80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4f90: 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
4fa0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4fb0: 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65 73  =OP_Lt);.    tes
4fc0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
4fd0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4fe0: 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
4ff0: 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d     testcase(op==
5000: 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
5010: 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
5020: 47 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Gt);.    testcas
5030: 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
5040: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
5050: 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 74  p==OP_Ge);.    t
5060: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
5070: 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
5080: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
5090: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
50a0: 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
50b0: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
50c0: 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  P_Ne);.    sqlit
50d0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
50e0: 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
50f0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  1);.    sqlite3R
5100: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
5110: 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
5120: 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66  .    if( i==nLef
5130: 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62 72 65  t-1 ){.      bre
5140: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
5150: 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b 0a  ( opx==TK_EQ ){.
5160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5170: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
5180: 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64 72 44  Not, dest, addrD
5190: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
51a0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
51b0: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
51c0: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  LL;.    }else if
51d0: 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b 0a  ( opx==TK_NE ){.
51e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
5200: 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65  , dest, addrDone
5210: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
5220: 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d 20  v);.      p5 |= 
5230: 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b  SQLITE_KEEPNULL;
5240: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5250: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
5260: 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 54  _LT || op==TK_GT
5270: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c   || op==TK_LE ||
5280: 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20   op==TK_GE );.  
5290: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
52a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73 65  ddOp2(v, OP_Else
52b0: 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72 44 6f  NotEq, 0, addrDo
52c0: 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ne);.      VdbeC
52d0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
52e0: 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56  =TK_LT);.      V
52f0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
5300: 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20   op==TK_GT);.   
5310: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
5320: 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29 3b  f(v, op==TK_LE);
5330: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
5340: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
5350: 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  GE);.      if( i
5360: 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78 20  ==nLeft-2 ) opx 
5370: 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = op;.    }.  }.
5380: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
5390: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
53a0: 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20 53  rDone);.}..#if S
53b0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
53c0: 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65  EPTH>0./*.** Che
53d0: 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  ck that argument
53e0: 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73   nHeight is less
53f0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
5400: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a  o the maximum.**
5410: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
5420: 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74  h allowed. If it
5430: 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61   is not, leave a
5440: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
5450: 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f  in.** pParse..*/
5460: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
5470: 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73  CheckHeight(Pars
5480: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
5490: 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72  Height){.  int r
54a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
54b0: 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20   int mxHeight = 
54c0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
54d0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
54e0: 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69  EXPR_DEPTH];.  i
54f0: 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69  f( nHeight>mxHei
5500: 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
5510: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5520: 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72  e, .       "Expr
5530: 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74  ession tree is t
5540: 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75  oo large (maximu
5550: 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78  m depth %d)", mx
5560: 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20  Height.    );.  
5570: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
5580: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
5590: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  n rc;.}../* The 
55a0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
55b0: 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68  functions, heigh
55c0: 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68  tOfExpr(), heigh
55d0: 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  tOfExprList().**
55e0: 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c   and heightOfSel
55f0: 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20  ect(), are used 
5600: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
5610: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a   maximum height.
5620: 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ** of any expres
5630: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
5640: 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75  nced by the stru
5650: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
5660: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
5670: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
5680: 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69  this maximum hei
5690: 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ght is greater t
56a0: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
56b0: 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a  value pointed.**
56c0: 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c   to by pnHeight,
56d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
56e0: 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20  meter, then set 
56f0: 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61  *pnHeight to tha
5700: 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  t.** value..*/.s
5710: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
5720: 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c  tOfExpr(Expr *p,
5730: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5740: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5750: 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a  if( p->nHeight>*
5760: 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  pnHeight ){.    
5770: 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d    *pnHeight = p-
5780: 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a  >nHeight;.    }.
5790: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
57a0: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  d heightOfExprLi
57b0: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
57c0: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
57d0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
57e0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
57f0: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
5800: 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68  ++){.      heigh
5810: 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e  tOfExpr(p->a[i].
5820: 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29  pExpr, pnHeight)
5830: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
5840: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
5850: 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  OfSelect(Select 
5860: 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20 2a 70  *pSelect, int *p
5870: 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65 6c 65  nHeight){.  Sele
5880: 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  ct *p;.  for(p=p
5890: 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70 2d 3e  Select; p; p=p->
58a0: 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68 65 69  pPrior){.    hei
58b0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68  ghtOfExpr(p->pWh
58c0: 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ere, pnHeight);.
58d0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
58e0: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48  (p->pHaving, pnH
58f0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5900: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d  htOfExpr(p->pLim
5910: 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  it, pnHeight);. 
5920: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
5930: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
5940: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5950: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5960: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
5970: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5980: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
5990: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
59a0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
59b0: 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48   Set the Expr.nH
59c0: 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69  eight variable i
59d0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
59e0: 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a  passed as an .**
59f0: 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78   argument. An ex
5a00: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f  pression with no
5a10: 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e   children, Expr.
5a20: 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70  pList or .** Exp
5a30: 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72  r.pSelect member
5a40: 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66   has a height of
5a50: 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78   1. Any other ex
5a60: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20  pression.** has 
5a70: 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74  a height equal t
5a80: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  o the maximum he
5a90: 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65  ight of any othe
5aa0: 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64  r .** referenced
5ab0: 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a   Expr plus one..
5ac0: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61  **.** Also propa
5ad0: 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61 74  gate EP_Propagat
5ae0: 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d 20  e flags up from 
5af0: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f 20  Expr.x.pList to 
5b00: 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20 69  Expr.flags,.** i
5b10: 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  f appropriate..*
5b20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
5b30: 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72  prSetHeight(Expr
5b40: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5b50: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5b60: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  tOfExpr(p->pLeft
5b70: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68  , &nHeight);.  h
5b80: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5b90: 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29  Right, &nHeight)
5ba0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
5bb0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
5bc0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
5bd0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5be0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48  ->x.pSelect, &nH
5bf0: 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20  eight);.  }else 
5c00: 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29  if( p->x.pList )
5c10: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  {.    heightOfEx
5c20: 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73  prList(p->x.pLis
5c30: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5c40: 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50    p->flags |= EP
5c50: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c  _Propagate & sql
5c60: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
5c70: 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  s(p->x.pList);. 
5c80: 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20   }.  p->nHeight 
5c90: 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d  = nHeight + 1;.}
5ca0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
5cb0: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
5cc0: 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  iable using the 
5cd0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20  exprSetHeight() 
5ce0: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20  function. If.** 
5cf0: 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72  the height is gr
5d00: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d  eater than the m
5d10: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65  aximum allowed e
5d20: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c  xpression depth,
5d30: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
5d40: 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a  or in pParse..**
5d50: 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61  .** Also propaga
5d60: 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67  te all EP_Propag
5d70: 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74  ate flags from t
5d80: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
5d90: 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61  into.** Expr.fla
5da0: 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gs. .*/.void sql
5db0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
5dc0: 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20  tAndFlags(Parse 
5dd0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
5de0: 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
5df0: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
5e00: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
5e10: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  p);.  sqlite3Exp
5e20: 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61  rCheckHeight(pPa
5e30: 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29  rse, p->nHeight)
5e40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5e50: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  n the maximum he
5e60: 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72  ight of any expr
5e70: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
5e80: 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65  renced.** by the
5e90: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
5ea0: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
5eb0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
5ec0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
5ed0: 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a  rHeight(Select *
5ee0: 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68  p){.  int nHeigh
5ef0: 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f  t = 0;.  heightO
5f00: 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69  fSelect(p, &nHei
5f10: 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  ght);.  return n
5f20: 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 20  Height;.}.#else 
5f30: 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67 68  /* ABOVE:  Heigh
5f40: 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65 6e  t enforcement en
5f50: 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20 48  abled.  BELOW: H
5f60: 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e  eight enforcemen
5f70: 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50  t off */./*.** P
5f80: 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f  ropagate all EP_
5f90: 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20  Propagate flags 
5fa0: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
5fb0: 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78  pList into.** Ex
5fc0: 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f  pr.flags. .*/.vo
5fd0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
5fe0: 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28  tHeightAndFlags(
5ff0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
6000: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
6010: 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 26   && p->x.pList &
6020: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
6030: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
6040: 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c  ct) ){.    p->fl
6050: 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67  ags |= EP_Propag
6060: 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78 70  ate & sqlite3Exp
6070: 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e  rListFlags(p->x.
6080: 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 64  pList);.  }.}.#d
6090: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
60a0: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
60b0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
60c0: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
60d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
60e0: 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f  is the core allo
60f0: 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e  cator for Expr n
6100: 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  odes..**.** Cons
6110: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
6120: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
6130: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
6140: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
6150: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
6160: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f   and for the pTo
6170: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ken argument is 
6180: 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  a single allocat
6190: 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20  ion.** obtained 
61a0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
61b0: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
61c0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
61d0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
61e0: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
61f0: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
6200: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
6210: 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  **.** If dequote
6220: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
6230: 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20  he token (if it 
6240: 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f  exists) is dequo
6250: 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ted..** If dequo
6260: 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20  te is false, no 
6270: 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72  dequoting is per
6280: 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64 65 51  formed.  The deQ
6290: 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uote.** paramete
62a0: 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  r is ignored if 
62b0: 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f  pToken is NULL o
62c0: 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20 64  r if the token d
62d0: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61  oes not.** appea
62e0: 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  r to be quoted. 
62f0: 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20 77   If the quotes w
6300: 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ere of the form 
6310: 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75  "..." (double-qu
6320: 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68  otes).** then th
6330: 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20 66  e EP_DblQuoted f
6340: 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
6350: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  e expression nod
6360: 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c  e..**.** Special
6370: 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54   case:  If op==T
6380: 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70 54  K_INTEGER and pT
6390: 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61  oken points to a
63a0: 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20   string that.** 
63b0: 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74 65  can be translate
63c0: 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74 20  d into a 32-bit 
63d0: 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68  integer, then th
63e0: 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a  e token is not.*
63f0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54  * stored in u.zT
6400: 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20  oken.  Instead, 
6410: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
6420: 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  es is written.**
6430: 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20 61   into u.iValue a
6440: 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  nd the EP_IntVal
6450: 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ue flag is set. 
6460: 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61 67   No extra storag
6470: 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65  e.** is allocate
6480: 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e  d to hold the in
6490: 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20 74  teger text and t
64a0: 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67 20  he dequote flag 
64b0: 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45  is ignored..*/.E
64c0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
64d0: 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65 33  Alloc(.  sqlite3
64e0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
64f0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73   /* Handle for s
6500: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6510: 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  wNN() */.  int o
6520: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6530: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6540: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e   opcode */.  con
6550: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  st Token *pToken
6560: 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72  ,    /* Token ar
6570: 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  gument.  Might b
6580: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
6590: 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20  dequote         
65a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64      /* True to d
65b0: 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45  equote */.){.  E
65c0: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  xpr *pNew;.  int
65d0: 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69   nExtra = 0;.  i
65e0: 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a  nt iValue = 0;..
65f0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
6600: 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  );.  if( pToken 
6610: 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54  ){.    if( op!=T
6620: 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54 6f  K_INTEGER || pTo
6630: 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20 20  ken->z==0.      
6640: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65      || sqlite3Ge
6650: 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a  tInt32(pToken->z
6660: 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b  , &iValue)==0 ){
6670: 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d 20  .      nExtra = 
6680: 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20  pToken->n+1;.   
6690: 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c 75     assert( iValu
66a0: 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  e>=0 );.    }.  
66b0: 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  }.  pNew = sqlit
66c0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
66d0: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29  db, sizeof(Expr)
66e0: 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20  +nExtra);.  if( 
66f0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d 73  pNew ){.    mems
6700: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
6710: 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 70  of(Expr));.    p
6720: 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  New->op = (u8)op
6730: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67 67  ;.    pNew->iAgg
6740: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70   = -1;.    if( p
6750: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  Token ){.      i
6760: 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a  f( nExtra==0 ){.
6770: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
6780: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
6790: 75 65 7c 45 50 5f 4c 65 61 66 7c 28 69 56 61 6c  ue|EP_Leaf|(iVal
67a0: 75 65 3f 45 50 5f 49 73 54 72 75 65 3a 45 50 5f  ue?EP_IsTrue:EP_
67b0: 49 73 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IsFalse);.      
67c0: 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
67d0: 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20   = iValue;.     
67e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
67f0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
6800: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
6810: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6820: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c  ( pToken->z!=0 |
6830: 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29  | pToken->n==0 )
6840: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
6850: 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79  oken->n ) memcpy
6860: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  (pNew->u.zToken,
6870: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
6880: 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  en->n);.        
6890: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70  pNew->u.zToken[p
68a0: 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  Token->n] = 0;. 
68b0: 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f         if( dequo
68c0: 74 65 20 26 26 20 73 71 6c 69 74 65 33 49 73 71  te && sqlite3Isq
68d0: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
68e0: 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ken[0]) ){.     
68f0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
6900: 6f 74 65 45 78 70 72 28 70 4e 65 77 29 3b 0a 20  oteExpr(pNew);. 
6910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6920: 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  .    }.#if SQLIT
6930: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
6940: 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65  >0.    pNew->nHe
6950: 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66  ight = 1;.#endif
6960: 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20    .  }.  return 
6970: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pNew;.}../*.** A
6980: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78  llocate a new ex
6990: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72  pression node fr
69a0: 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  om a zero-termin
69b0: 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20  ated token that 
69c0: 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62  has.** already b
69d0: 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f  een dequoted..*/
69e0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
69f0: 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
6a00: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
6a10: 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69   Handle for sqli
6a20: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
6a30: 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20  ) (may be null) 
6a40: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6a60: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
6a70: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
6a80: 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f  r *zToken      /
6a90: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
6aa0: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
6ab0: 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78   */.){.  Token x
6ac0: 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e  ;.  x.z = zToken
6ad0: 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65  ;.  x.n = sqlite
6ae0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
6af0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
6b00: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
6b10: 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a   op, &x, 0);.}..
6b20: 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62  /*.** Attach sub
6b30: 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20  trees pLeft and 
6b40: 70 52 69 67 68 74 20 74 6f 20 74 68 65 20 45 78  pRight to the Ex
6b50: 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a  pr node pRoot..*
6b60: 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e  *.** If pRoot==N
6b70: 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ULL that means t
6b80: 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c  hat a memory all
6b90: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
6ba0: 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49  s occurred..** I
6bb0: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c  n that case, del
6bc0: 65 74 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ete the subtrees
6bd0: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
6be0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
6bf0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
6c00: 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20  rees(.  sqlite3 
6c10: 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f  *db,.  Expr *pRo
6c20: 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  ot,.  Expr *pLef
6c30: 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  t,.  Expr *pRigh
6c40: 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74  t.){.  if( pRoot
6c50: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
6c60: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
6c70: 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  led );.    sqlit
6c80: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
6c90: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c   pLeft);.    sql
6ca0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6cb0: 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65  b, pRight);.  }e
6cc0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69  lse{.    if( pRi
6cd0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  ght ){.      pRo
6ce0: 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ot->pRight = pRi
6cf0: 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  ght;.      pRoot
6d00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
6d10: 6f 70 61 67 61 74 65 20 26 20 70 52 69 67 68 74  opagate & pRight
6d20: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
6d30: 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a     if( pLeft ){.
6d40: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65        pRoot->pLe
6d50: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20  ft = pLeft;.    
6d60: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
6d70: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
6d80: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20   pLeft->flags;. 
6d90: 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74     }.    exprSet
6da0: 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20  Height(pRoot);. 
6db0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
6dc0: 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64  cate an Expr nod
6dd0: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
6de0: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
6df0: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
6e00: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
6e10: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
6e20: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
6e30: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
6e40: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
6e50: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
6e60: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
6e70: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
6e80: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
6e90: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
6ea0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
6eb0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
6ec0: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
6ed0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
6ee0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
6ef0: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
6f00: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6f10: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6f20: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
6f30: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
6f40: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
6f50: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
6f60: 70 52 69 67 68 74 20 20 20 20 20 20 20 20 20 20  pRight          
6f70: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
6f80: 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  nd */.){.  Expr 
6f90: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
6fa0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
6fb0: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
6fc0: 66 28 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20  f(Expr));.  if( 
6fd0: 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  p ){.    memset(
6fe0: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  p, 0, sizeof(Exp
6ff0: 72 29 29 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  r));.    p->op =
7000: 20 6f 70 20 26 20 30 78 66 66 3b 0a 20 20 20 20   op & 0xff;.    
7010: 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  p->iAgg = -1;.  
7020: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
7030: 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72  achSubtrees(pPar
7040: 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74  se->db, p, pLeft
7050: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 73  , pRight);.    s
7060: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
7070: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
7080: 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c  >nHeight);.  }el
7090: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
70a0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
70b0: 2d 3e 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  ->db, pLeft);.  
70c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
70d0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
70e0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72  pRight);.  }.  r
70f0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
7100: 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20 74 6f  * Add pSelect to
7110: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53 65 6c   the Expr.x.pSel
7120: 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20  ect field.  Or, 
7130: 69 66 20 70 45 78 70 72 20 69 73 20 4e 55 4c 4c  if pExpr is NULL
7140: 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65   (due.** do a me
7150: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
7160: 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20 64 65  failure) then de
7170: 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65 63 74  lete the pSelect
7180: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   object..*/.void
7190: 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64 64   sqlite3PExprAdd
71a0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
71b0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
71c0: 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
71d0: 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  ct){.  if( pExpr
71e0: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78   ){.    pExpr->x
71f0: 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65  .pSelect = pSele
7200: 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50  ct;.    ExprSetP
7210: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
7220: 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53  P_xIsSelect|EP_S
7230: 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71  ubquery);.    sq
7240: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
7250: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
7260: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c  e, pExpr);.  }el
7270: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
7280: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
7290: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
72a0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
72b0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
72c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a  pSelect);.  }.}.
72d0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f  ../*.** Join two
72e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69   expressions usi
72f0: 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ng an AND operat
7300: 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65  or.  If either e
7310: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
7320: 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20  NULL, then just 
7330: 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72  return the other
7340: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
7350: 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f  ** If one side o
7360: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
7370: 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20  he AND is known 
7380: 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65  to be false, the
7390: 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20  n instead.** of 
73a0: 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44  returning an AND
73b0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73   expression, jus
73c0: 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74  t return a const
73d0: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ant expression w
73e0: 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f  ith.** a value o
73f0: 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72  f false..*/.Expr
7400: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64   *sqlite3ExprAnd
7410: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7420: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
7430: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 73 71  r *pRight){.  sq
7440: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7450: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c  se->db;.  if( pL
7460: 65 66 74 3d 3d 30 20 20 29 7b 0a 20 20 20 20 72  eft==0  ){.    r
7470: 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20  eturn pRight;.  
7480: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
7490: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
74a0: 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65  n pLeft;.  }else
74b0: 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73 46   if( ExprAlwaysF
74c0: 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 45  alse(pLeft) || E
74d0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
74e0: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71  Right) ){.    sq
74f0: 6c 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e  lite3ExprUnmapAn
7500: 64 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20  dDelete(pParse, 
7510: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
7520: 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64 44  te3ExprUnmapAndD
7530: 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70 52  elete(pParse, pR
7540: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
7550: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  n sqlite3Expr(db
7560: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 22 30  , TK_INTEGER, "0
7570: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
7580: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
7590: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
75a0: 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  AND, pLeft, pRig
75b0: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
75c0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
75d0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
75e0: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
75f0: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
7600: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
7610: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
7620: 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20 50 61 72  rFunction(.  Par
7630: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7640: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
7650: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
7660: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
7670: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6c 69 73   /* Argument lis
7680: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
7690: 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  oken,        /* 
76a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63  Name of the func
76b0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 44  tion */.  int eD
76c0: 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 20 20  istinct         
76d0: 2f 2a 20 53 46 5f 44 69 73 74 69 6e 63 74 20 6f  /* SF_Distinct o
76e0: 72 20 53 46 5f 41 4c 4c 20 6f 72 20 30 20 2a 2f  r SF_ALL or 0 */
76f0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
7700: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7710: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7720: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
7730: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
7740: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
7750: 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f  TK_FUNCTION, pTo
7760: 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ken, 1);.  if( p
7770: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
7780: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
7790: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
77a0: 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20  /* Avoid memory 
77b0: 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  leak when malloc
77c0: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
77d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
77e0: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
77f0: 2d 3e 6e 45 78 70 72 20 3e 20 70 50 61 72 73 65  ->nExpr > pParse
7800: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
7810: 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
7820: 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20 20 20 20 73  ON_ARG] ){.    s
7830: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7840: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
7850: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75   arguments on fu
7860: 6e 63 74 69 6f 6e 20 25 54 22 2c 20 70 54 6f 6b  nction %T", pTok
7870: 65 6e 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  en);.  }.  pNew-
7880: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
7890: 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  ;.  ExprSetPrope
78a0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 48 61 73  rty(pNew, EP_Has
78b0: 46 75 6e 63 29 3b 0a 20 20 61 73 73 65 72 74 28  Func);.  assert(
78c0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
78d0: 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65  y(pNew, EP_xIsSe
78e0: 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  lect) );.  sqlit
78f0: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
7900: 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20  ndFlags(pParse, 
7910: 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 65 44 69  pNew);.  if( eDi
7920: 73 74 69 6e 63 74 3d 3d 53 46 5f 44 69 73 74 69  stinct==SF_Disti
7930: 6e 63 74 20 29 20 45 78 70 72 53 65 74 50 72 6f  nct ) ExprSetPro
7940: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 44  perty(pNew, EP_D
7950: 69 73 74 69 6e 63 74 29 3b 0a 20 20 72 65 74 75  istinct);.  retu
7960: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
7970: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
7980: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
7990: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
79a0: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
79b0: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
79c0: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
79d0: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
79e0: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
79f0: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
7a00: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
7a10: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7a20: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
7a30: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
7a40: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
7a50: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
7a60: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
7a70: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
7a80: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
7a90: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20   is not too big 
7aa0: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
7ab0: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
7ac0: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
7ad0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
7ae0: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
7af0: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
7b00: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7b10: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c  the form ":aaa",
7b20: 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61   "@aaa", or "$aa
7b30: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
7b40: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
7b50: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
7b60: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
7b70: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
7b80: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
7b90: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
7ba0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
7bb0: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
7bc0: 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69   sequential vari
7bd0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
7be0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
7bf0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
7c00: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
7c10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
7c20: 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e  pr *pExpr, u32 n
7c30: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7c40: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7c50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7c60: 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66    ynVar x;..  if
7c70: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
7c80: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21  urn;.  assert( !
7c90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7ca0: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
7cb0: 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50  ue|EP_Reduced|EP
7cc0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20  _TokenOnly) );. 
7cd0: 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54   z = pExpr->u.zT
7ce0: 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
7cf0: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
7d00: 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61  ( z[0]!=0 );.  a
7d10: 73 73 65 72 74 28 20 6e 3d 3d 28 75 33 32 29 73  ssert( n==(u32)s
7d20: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7d30: 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  ) );.  if( z[1]=
7d40: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
7d50: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
7d60: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
7d70: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
7d80: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
7d90: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
7da0: 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79 6e 56   );.    x = (ynV
7db0: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
7dc0: 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ar);.  }else{.  
7dd0: 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20 30 3b    int doAdd = 0;
7de0: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
7df0: 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  ?' ){.      /* W
7e00: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
7e10: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
7e20: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
7e30: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
7e40: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
7e50: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
7e60: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ber */.      i64
7e70: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   i;.      int bO
7e80: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  k;.      if( n==
7e90: 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  2 ){ /*OPTIMIZAT
7ea0: 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20  ION-IF-TRUE*/.  
7eb0: 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d 2d 27        i = z[1]-'
7ec0: 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  0';  /* The comm
7ed0: 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20 66 6f  on case of ?N fo
7ee0: 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67 69 74  r a single digit
7ef0: 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f   N */.        bO
7f00: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  k = 1;.      }el
7f10: 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20  se{.        bOk 
7f20: 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  = 0==sqlite3Atoi
7f30: 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d  64(&z[1], &i, n-
7f40: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  1, SQLITE_UTF8);
7f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
7f60: 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b  estcase( i==0 );
7f70: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7f80: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74   i==1 );.      t
7f90: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
7fa0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7fb0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7fc0: 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20  BER]-1 );.      
7fd0: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
7fe0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7ff0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
8000: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69  MBER] );.      i
8010: 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31  f( bOk==0 || i<1
8020: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
8030: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8040: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
8050: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8060: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8070: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
8080: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
8090: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
80b0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
80c0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
80d0: 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  BER]);.        r
80e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
80f0: 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29       x = (ynVar)
8100: 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  i;.      if( x>p
8110: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
8120: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
8130: 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20 20  Var = (int)x;.  
8140: 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b        doAdd = 1;
8150: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8160: 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d   sqlite3VListNum
8170: 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70  ToName(pParse->p
8180: 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b 0a  VList, x)==0 ){.
8190: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
81a0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
81b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
81c0: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
81d0: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
81e0: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
81f0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
8200: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
8210: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
8220: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
8230: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
8240: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
8250: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
8260: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
8270: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
8280: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
8290: 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20     */.      x = 
82a0: 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33 56 4c  (ynVar)sqlite3VL
82b0: 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50 61  istNameToNum(pPa
82c0: 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20  rse->pVList, z, 
82d0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3d  n);.      if( x=
82e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20  =0 ){.        x 
82f0: 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72  = (ynVar)(++pPar
8300: 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20  se->nVar);.     
8310: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8320: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8330: 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20 20 20  if( doAdd ){.   
8340: 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73     pParse->pVLis
8350: 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74  t = sqlite3VList
8360: 41 64 64 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  Add(db, pParse->
8370: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78 29  pVList, z, n, x)
8380: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
8390: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78  xpr->iColumn = x
83a0: 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e 61 4c  ;.  if( x>db->aL
83b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
83c0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
83d0: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
83e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
83f0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
8400: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
8410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
8420: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
8430: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
8440: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
8450: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
8460: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8470: 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eNN(sqlite3 *db,
8480: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73   Expr *p){.  ass
8490: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f  ert( p!=0 );.  /
84a0: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
84b0: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
84c0: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
84d0: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
84e0: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
84f0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
8500: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
8510: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
8520: 75 65 3e 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65  ue>=0 );..  asse
8530: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
8540: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
8550: 6e 63 29 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e  nc) || p->y.pWin
8560: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
8570: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73  cFailed );.  ass
8580: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46  ert( p->op!=TK_F
8590: 55 4e 43 54 49 4f 4e 20 7c 7c 20 45 78 70 72 48  UNCTION || ExprH
85a0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
85b0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
85c0: 64 75 63 65 64 29 0a 20 20 20 20 20 20 20 20 20  duced).         
85d0: 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e 3d 3d 30   || p->y.pWin==0
85e0: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
85f0: 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e  rty(p, EP_WinFun
8600: 63 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  c) );.#ifdef SQL
8610: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
8620: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8630: 70 2c 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21  p, EP_Leaf) && !
8640: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8650: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
8660: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8670: 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20  p->pLeft==0 );. 
8680: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
8690: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ight==0 );.    a
86a0: 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c  ssert( p->x.pSel
86b0: 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  ect==0 );.  }.#e
86c0: 6e 64 69 66 0a 20 20 69 66 28 20 21 45 78 70 72  ndif.  if( !Expr
86d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28  HasProperty(p, (
86e0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
86f0: 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a  Leaf)) ){.    /*
8700: 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f   The Expr.x unio
8710: 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  n is never used 
8720: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
8730: 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20   as Expr.pRight 
8740: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
8750: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
8760: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
8770: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
8780: 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45   && p->op!=TK_SE
8790: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71  LECT_COLUMN ) sq
87a0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
87b0: 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  N(db, p->pLeft);
87c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67  .    if( p->pRig
87d0: 68 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ht ){.      asse
87e0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
87f0: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
8800: 6e 63 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  nc) );.      sql
8810: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e  ite3ExprDeleteNN
8820: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
8830: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 45  .    }else if( E
8840: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8850: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
8860: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
8870: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
8880: 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  y(p, EP_WinFunc)
8890: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
88a0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
88b0: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  , p->x.pSelect);
88c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
88d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
88e0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
88f0: 2e 70 4c 69 73 74 29 3b 0a 23 69 66 6e 64 65 66  .pList);.#ifndef
8900: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
8910: 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66  DOWFUNC.      if
8920: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8930: 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  y(p, EP_WinFunc)
8940: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8950: 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28  te3WindowDelete(
8960: 64 62 2c 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a  db, p->y.pWin);.
8970: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
8980: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 45     }.  }.  if( E
8990: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
89a0: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
89b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
89c0: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
89d0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
89e0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74  roperty(p, EP_St
89f0: 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c  atic) ){.    sql
8a00: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
8a10: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20   p);.  }.}.void 
8a20: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8a30: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
8a40: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
8a50: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65   ) sqlite3ExprDe
8a60: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  leteNN(db, p);.}
8a70: 0a 0a 2f 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69  ../* Invoke sqli
8a80: 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d  te3RenameExprUnm
8a90: 61 70 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ap() and sqlite3
8aa0: 45 78 70 72 44 65 6c 65 74 65 28 29 20 6f 6e 20  ExprDelete() on 
8ab0: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
8ac0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8ad0: 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64 44 65  e3ExprUnmapAndDe
8ae0: 6c 65 74 65 28 50 61 72 73 65 20 2a 70 50 61 72  lete(Parse *pPar
8af0: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
8b00: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
8b10: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
8b20: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
8b30: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
8b40: 70 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  p(pParse, p);.  
8b50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
8b60: 78 70 72 44 65 6c 65 74 65 4e 4e 28 70 50 61 72  xprDeleteNN(pPar
8b70: 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  se->db, p);.  }.
8b80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8b90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
8ba0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
8bb0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
8bc0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
8bd0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
8be0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
8bf0: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
8c00: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
8c10: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
8c20: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
8c30: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
8c40: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
8c50: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
8c60: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
8c70: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8c80: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
8c90: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
8ca0: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
8cb0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8cc0: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
8cd0: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
8ce0: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
8cf0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
8d00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70  }../*.** The dup
8d10: 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f  edExpr*Size() ro
8d20: 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75  utines each retu
8d30: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
8d40: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a   bytes required.
8d50: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f  ** to store a co
8d60: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
8d70: 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f  ion or expressio
8d80: 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69  n tree.  They di
8d90: 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d  ffer in.** how m
8da0: 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  uch of the tree 
8db0: 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a  is measured..**.
8dc0: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
8dd0: 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20  StructSize()    
8de0: 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68   Size of only th
8df0: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
8e00: 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78   .**     dupedEx
8e10: 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20  prNodeSize()    
8e20: 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20     Size of Expr 
8e30: 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65  + space for toke
8e40: 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  n.**     dupedEx
8e50: 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20  prSize()        
8e60: 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20     Expr + token 
8e70: 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e  + subtree compon
8e80: 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ents.**.********
8e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ed0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75  ***.**.** The du
8ee0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
8ef0: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  e() function ret
8f00: 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20  urns two values 
8f10: 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20  OR-ed together: 
8f20: 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61   .** (1) the spa
8f30: 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
8f40: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
8f50: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c  pr structure onl
8f60: 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68  y and .** (2) th
8f70: 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74  e EP_xxx flags t
8f80: 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61  hat indicate wha
8f90: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
8fa0: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a  size should be..
8fb0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
8fc0: 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f  lues is always o
8fd0: 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
8fe0: 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a    EXPR_FULLSIZE.
8ff0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44  **      EXPR_RED
9000: 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f  UCEDSIZE   | EP_
9010: 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20  Reduced.**      
9020: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
9030: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
9040: 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  y.**.** The size
9050: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
9060: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  e can be found b
9070: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65  y masking the re
9080: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66  turn value.** of
9090: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
90a0: 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66  th 0xfff.  The f
90b0: 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  lags can be foun
90c0: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
90d0: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
90e0: 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64   with EP_Reduced
90f0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a  |EP_TokenOnly..*
9100: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
9110: 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  ith flags==EXPRD
9120: 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20  UP_REDUCE, this 
9130: 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f  routines works o
9140: 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28  n full-size.** (
9150: 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20  unreduced) Expr 
9160: 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20  objects as they 
9170: 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  or originally co
9180: 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
9190: 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69   parser..** Duri
91a0: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ng expression an
91b0: 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e  alysis, extra in
91c0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d  formation is com
91d0: 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20  puted and moved 
91e0: 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61  into.** later pa
91f0: 72 74 73 20 6f 66 20 74 68 65 20 45 78 70 72 20  rts of the Expr 
9200: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
9210: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
9220: 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70  n might get chop
9230: 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68  ped.** off if th
9240: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9250: 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61  reduced.  Note a
9260: 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  lso that it does
9270: 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20   not work to.** 
9280: 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f  make an EXPRDUP_
9290: 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61  REDUCE copy of a
92a0: 20 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73   reduced express
92b0: 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ion.  It is only
92c0: 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64   legal.** to red
92d0: 75 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65  uce a pristine e
92e0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66  xpression tree f
92f0: 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20  rom the parser. 
9300: 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
9310: 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45  ion.** of dupedE
9320: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
9330: 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65  contain multiple
9340: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
9350: 65 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70  ents that attemp
9360: 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20  t.** to enforce 
9370: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
9380: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9390: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
93a0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
93b0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53  flags){.  int nS
93c0: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ize;.  assert( f
93d0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
93e0: 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30  DUCE || flags==0
93f0: 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20   ); /* Only one 
9400: 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77  flag value allow
9410: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
9420: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30  EXPR_FULLSIZE<=0
9430: 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74  xfff );.  assert
9440: 28 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52  ( (0xfff & (EP_R
9450: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
9460: 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66  nly))==0 );.  if
9470: 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20 70 2d  ( 0==flags || p-
9480: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op==TK_SELECT_C
9490: 4f 4c 55 4d 4e 20 0a 23 69 66 6e 64 65 66 20 53  OLUMN .#ifndef S
94a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
94b0: 57 46 55 4e 43 0a 20 20 20 7c 7c 20 45 78 70 72  WFUNC.   || Expr
94c0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
94d0: 50 5f 57 69 6e 46 75 6e 63 29 0a 23 65 6e 64 69  P_WinFunc).#endi
94e0: 66 0a 20 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  f.  ){.    nSize
94f0: 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45   = EXPR_FULLSIZE
9500: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
9510: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9520: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
9530: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
9540: 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ed) );.    asser
9550: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
9560: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
9570: 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65  in) ); .    asse
9580: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9590: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
95a0: 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ken) );.    asse
95b0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
95c0: 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64  erty(p, EP_NoRed
95d0: 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20  uce) );.    if( 
95e0: 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78  p->pLeft || p->x
95f0: 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  .pList ){.      
9600: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44  nSize = EXPR_RED
9610: 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65  UCEDSIZE | EP_Re
9620: 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65  duced;.    }else
9630: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9640: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
9650: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
9660: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
9670: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b   | EP_TokenOnly;
9680: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9690: 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  urn nSize;.}../*
96a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
96b0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70  n returns the sp
96c0: 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71  ace in bytes req
96d0: 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74  uired to store t
96e0: 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74  he copy .** of t
96f0: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
9700: 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  e and a copy of 
9710: 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  the Expr.u.zToke
9720: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61  n string (if tha
9730: 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64  t.** string is d
9740: 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74  efined.).*/.stat
9750: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
9760: 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70  NodeSize(Expr *p
9770: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
9780: 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65  int nByte = dupe
9790: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
97a0: 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66  p, flags) & 0xff
97b0: 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  f;.  if( !ExprHa
97c0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
97d0: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
97e0: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
97f0: 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
9800: 53 74 72 6c 65 6e 33 30 4e 4e 28 70 2d 3e 75 2e  Strlen30NN(p->u.
9810: 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20  zToken)+1;.  }. 
9820: 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e   return ROUND8(n
9830: 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Byte);.}../*.** 
9840: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
9850: 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
9860: 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  red to create a 
9870: 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65  duplicate of the
9880: 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20   .** expression 
9890: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
98a0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
98b0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
98c0: 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63  t is a.** mask c
98d0: 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55  ontaining EXPRDU
98e0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a  P_XXX flags..**.
98f0: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
9900: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73  urned includes s
9910: 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61  pace to create a
9920: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
9930: 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65  r struct.** itse
9940: 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65  lf and the buffe
9950: 72 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79  r referred to by
9960: 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20   Expr.u.zToken, 
9970: 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  if any..**.** If
9980: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
9990: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
99a0: 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
99b0: 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20   value includes 
99c0: 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70  .** space to dup
99d0: 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20  licate all Expr 
99e0: 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65  nodes in the tre
99f0: 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72  e formed by Expr
9a00: 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45  .pLeft .** and E
9a10: 78 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61  xpr.pRight varia
9a20: 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f  bles (but not fo
9a30: 72 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73  r any structures
9a40: 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a   pointed to or .
9a50: 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f  ** descended fro
9a60: 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69  m the Expr.x.pLi
9a70: 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65  st or Expr.x.pSe
9a80: 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e  lect variables).
9a90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9aa0: 75 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70  upedExprSize(Exp
9ab0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
9ac0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
9ad0: 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  0;.  if( p ){.  
9ae0: 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45    nByte = dupedE
9af0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
9b00: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66  lags);.    if( f
9b10: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
9b20: 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79  UCE ){.      nBy
9b30: 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53  te += dupedExprS
9b40: 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c  ize(p->pLeft, fl
9b50: 61 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72  ags) + dupedExpr
9b60: 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20  Size(p->pRight, 
9b70: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
9b80: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65  }.  return nByte
9b90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9ba0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
9bb0: 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78  lar to sqlite3Ex
9bc0: 70 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20  prDup(), except 
9bd0: 74 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72  that if pzBuffer
9be0: 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   .** is not NULL
9bf0: 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20   then *pzBuffer 
9c00: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f  is assumed to po
9c10: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
9c20: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a  large enough .**
9c30: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
9c40: 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  py of expression
9c50: 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f   p, the copies o
9c60: 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a  f p->u.zToken.**
9c70: 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29   (if applicable)
9c80: 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73  , and the copies
9c90: 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74   of the p->pLeft
9ca0: 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65   and p->pRight e
9cb0: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69  xpressions,.** i
9cc0: 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65  f any. Before re
9cd0: 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66  turning, *pzBuff
9ce0: 65 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  er is set to the
9cf0: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
9d00: 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20   the.** portion 
9d10: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  of the buffer co
9d20: 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69  pied into by thi
9d30: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
9d40: 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72  tatic Expr *expr
9d50: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
9d60: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 64 75   Expr *p, int du
9d70: 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42  pFlags, u8 **pzB
9d80: 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a  uffer){.  Expr *
9d90: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
9da0: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
9db0: 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c  rn */.  u8 *zAll
9dc0: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  oc;           /*
9dd0: 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 66 72   Memory space fr
9de0: 6f 6d 20 77 68 69 63 68 20 74 6f 20 62 75 69 6c  om which to buil
9df0: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f  d Expr object */
9e00: 0a 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61  .  u32 staticFla
9e10: 67 3b 20 20 20 20 20 20 20 2f 2a 20 45 50 5f 53  g;       /* EP_S
9e20: 74 61 74 69 63 20 69 66 20 73 70 61 63 65 20 6e  tatic if space n
9e30: 6f 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ot obtained from
9e40: 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73   malloc */..  as
9e50: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
9e60: 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20   assert( p );.  
9e70: 61 73 73 65 72 74 28 20 64 75 70 46 6c 61 67 73  assert( dupFlags
9e80: 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d  ==0 || dupFlags=
9e90: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
9ea0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 42  );.  assert( pzB
9eb0: 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46  uffer==0 || dupF
9ec0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
9ed0: 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  DUCE );..  /* Fi
9ee0: 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74  gure out where t
9ef0: 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20  o write the new 
9f00: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20  Expr structure. 
9f10: 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75 66 66 65  */.  if( pzBuffe
9f20: 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20  r ){.    zAlloc 
9f30: 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20  = *pzBuffer;.   
9f40: 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50   staticFlag = EP
9f50: 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65  _Static;.  }else
9f60: 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73  {.    zAlloc = s
9f70: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
9f80: 77 4e 4e 28 64 62 2c 20 64 75 70 65 64 45 78 70  wNN(db, dupedExp
9f90: 72 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67  rSize(p, dupFlag
9fa0: 73 29 29 3b 0a 20 20 20 20 73 74 61 74 69 63 46  s));.    staticF
9fb0: 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  lag = 0;.  }.  p
9fc0: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
9fd0: 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65  lloc;..  if( pNe
9fe0: 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20  w ){.    /* Set 
9ff0: 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20  nNewSize to the 
a000: 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  size allocated f
a010: 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65  or the structure
a020: 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20   pointed to.    
a030: 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73  ** by pNew. This
a040: 20 69 73 20 65 69 74 68 65 72 20 45 58 50 52 5f   is either EXPR_
a050: 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52  FULLSIZE, EXPR_R
a060: 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20  EDUCEDSIZE or.  
a070: 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f    ** EXPR_TOKENO
a080: 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20  NLYSIZE. nToken 
a090: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
a0a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f  mber of bytes co
a0b0: 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79  nsumed.    ** by
a0c0: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65   the copy of the
a0d0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72   p->u.zToken str
a0e0: 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  ing (if any)..  
a0f0: 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75    */.    const u
a100: 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53  nsigned nStructS
a110: 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72 53  ize = dupedExprS
a120: 74 72 75 63 74 53 69 7a 65 28 70 2c 20 64 75 70  tructSize(p, dup
a130: 46 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73  Flags);.    cons
a140: 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d  t int nNewSize =
a150: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 30   nStructSize & 0
a160: 78 66 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54  xfff;.    int nT
a170: 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 21 45  oken;.    if( !E
a180: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a190: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
a1a0: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
a1b0: 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20  .      nToken = 
a1c0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
a1d0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31  p->u.zToken) + 1
a1e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a1f0: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20     nToken = 0;. 
a200: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 75 70     }.    if( dup
a210: 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 61  Flags ){.      a
a220: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
a230: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64  operty(p, EP_Red
a240: 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20  uced)==0 );.    
a250: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
a260: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
a270: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a280: 75 33 32 20 6e 53 69 7a 65 20 3d 20 28 75 33 32  u32 nSize = (u32
a290: 29 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  )exprStructSize(
a2a0: 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  p);.      memcpy
a2b0: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a  (zAlloc, p, nSiz
a2c0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53  e);.      if( nS
a2d0: 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a  ize<EXPR_FULLSIZ
a2e0: 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20 6d 65  E ){ .        me
a2f0: 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69  mset(&zAlloc[nSi
a300: 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c  ze], 0, EXPR_FUL
a310: 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20  LSIZE-nSize);.  
a320: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a330: 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52   /* Set the EP_R
a340: 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e  educed, EP_Token
a350: 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61  Only, and EP_Sta
a360: 74 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70  tic flags approp
a370: 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20  riately. */.    
a380: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pNew->flags &= ~
a390: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
a3a0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74  okenOnly|EP_Stat
a3b0: 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b  ic|EP_MemToken);
a3c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
a3d0: 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20   |= nStructSize 
a3e0: 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50  & (EP_Reduced|EP
a3f0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20  _TokenOnly);.   
a400: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
a410: 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20  staticFlag;..   
a420: 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e   /* Copy the p->
a430: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c  u.zToken string,
a440: 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
a450: 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( nToken ){.  
a460: 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e      char *zToken
a470: 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65   = pNew->u.zToke
a480: 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c  n = (char*)&zAll
a490: 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20  oc[nNewSize];.  
a4a0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65      memcpy(zToke
a4b0: 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  n, p->u.zToken, 
a4c0: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a  nToken);.    }..
a4d0: 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e      if( 0==((p->
a4e0: 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67  flags|pNew->flag
a4f0: 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e  s) & (EP_TokenOn
a500: 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a  ly|EP_Leaf)) ){.
a510: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
a520: 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65   the pNew->x.pSe
a530: 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e  lect or pNew->x.
a540: 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f  pList member. */
a550: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
a560: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
a570: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
a580: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
a590: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
a5a0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
a5b0: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75 70 46  >x.pSelect, dupF
a5c0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lags);.      }el
a5d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
a5e0: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69  ->x.pList = sqli
a5f0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
a600: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 64  b, p->x.pList, d
a610: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a620: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a630: 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c  Fill in pNew->pL
a640: 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52  eft and pNew->pR
a650: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ight. */.    if(
a660: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a670: 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65  (pNew, EP_Reduce
a680: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  d|EP_TokenOnly|E
a690: 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
a6a0: 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75      zAlloc += du
a6b0: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
a6c0: 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  p, dupFlags);.  
a6d0: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a6e0: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
a6f0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
a700: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
a710: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
a720: 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20  >pLeft ?.       
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
a740: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
a750: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
a760: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20  UCE, &zAlloc) : 
a770: 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
a780: 3e 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69  >pRight = p->pRi
a790: 67 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20  ght ?.          
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
a7b0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
a7c0: 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ht, EXPRDUP_REDU
a7d0: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30  CE, &zAlloc) : 0
a7e0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
a7f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
a800: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69  NDOWFUNC.      i
a810: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a820: 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63  ty(p, EP_WinFunc
a830: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
a840: 77 2d 3e 79 2e 70 57 69 6e 20 3d 20 73 71 6c 69  w->y.pWin = sqli
a850: 74 65 33 57 69 6e 64 6f 77 44 75 70 28 64 62 2c  te3WindowDup(db,
a860: 20 70 4e 65 77 2c 20 70 2d 3e 79 2e 70 57 69 6e   pNew, p->y.pWin
a870: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a880: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
a890: 74 79 28 70 4e 65 77 2c 20 45 50 5f 57 69 6e 46  ty(pNew, EP_WinF
a8a0: 75 6e 63 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a  unc) );.      }.
a8b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
a8c0: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
a8d0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 7a   */.      if( pz
a8e0: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
a8f0: 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41    *pzBuffer = zA
a900: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lloc;.      }.  
a910: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
a920: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a930: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
a940: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
a950: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
a960: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
a970: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
a980: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
a990: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
a9a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a9b0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70  >iColumn==0 || p
a9c0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
a9d0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
a9e0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c   p->pRight==0  |
a9f0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e  | p->pRight==p->
aa00: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20  pLeft );.       
aa10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
aa20: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
aa30: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
aa40: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
aa50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aa60: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
aa70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
aa80: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
aa90: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
aaa0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
aab0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
aac0: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
aad0: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
aae0: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
aaf0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
ab00: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
ab10: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
ab20: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
ab30: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
ab40: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
ab50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
ab60: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
ab70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
ab80: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
ab90: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
aba0: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
abb0: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
abc0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
abd0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
abe0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
abf0: 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   + sizeof(p->a[0
ac00: 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29  ]) * (p->nCte-1)
ac10: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
ac20: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
ac30: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
ac40: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
ac50: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
ac60: 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e  pRet->nCte = p->
ac70: 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  nCte;.      for(
ac80: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20  i=0; i<p->nCte; 
ac90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 52  i++){.        pR
aca0: 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  et->a[i].pSelect
acb0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
acc0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
acd0: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
ace0: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
acf0: 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 45  pCols = sqlite3E
ad00: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
ad10: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29  ->a[i].pCols, 0)
ad20: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
ad30: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
ad40: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
ad50: 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b   p->a[i].zName);
ad60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ad70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
ad80: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
ad90: 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29 20  ne withDup(x,y) 
ada0: 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  0.#endif..#ifnde
adb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
adc0: 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 54  NDOWFUNC./*.** T
add0: 68 65 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  he gatherSelectW
ade0: 69 6e 64 6f 77 73 28 29 20 70 72 6f 63 65 64 75  indows() procedu
adf0: 72 65 20 61 6e 64 20 69 74 73 20 68 65 6c 70 65  re and its helpe
ae00: 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 67 61 74  r routine.** gat
ae10: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
ae20: 43 61 6c 6c 62 61 63 6b 28 29 20 61 72 65 20 75  Callback() are u
ae30: 73 65 64 20 74 6f 20 73 63 61 6e 20 61 6c 6c 20  sed to scan all 
ae40: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
ae50: 2a 2a 20 61 6e 20 61 20 6e 65 77 6c 79 20 64 75  ** an a newly du
ae60: 70 6c 69 63 61 74 65 64 20 53 45 4c 45 43 54 20  plicated SELECT 
ae70: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 67 61  statement and ga
ae80: 74 68 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  ther all of the 
ae90: 57 69 6e 64 6f 77 0a 2a 2a 20 6f 62 6a 65 63 74  Window.** object
aea0: 73 20 66 6f 75 6e 64 20 74 68 65 72 65 2c 20 61  s found there, a
aeb0: 73 73 65 6d 62 6c 69 6e 67 20 74 68 65 6d 20 6f  ssembling them o
aec0: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
aed0: 69 73 74 20 61 74 20 53 65 6c 65 63 74 2d 3e 70  ist at Select->p
aee0: 57 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Win..*/.static i
aef0: 6e 74 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  nt gatherSelectW
af00: 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b 28 57  indowsCallback(W
af10: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
af20: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
af30: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
af40: 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 45 78  K_FUNCTION && Ex
af50: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
af60: 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  xpr, EP_WinFunc)
af70: 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
af80: 70 53 65 6c 65 63 74 20 3d 20 70 57 61 6c 6b 65  pSelect = pWalke
af90: 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->u.pSelect;.  
afa0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d    Window *pWin =
afb0: 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 3b 0a   pExpr->y.pWin;.
afc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
afd0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
afe0: 49 73 57 69 6e 64 6f 77 46 75 6e 63 28 70 45 78  IsWindowFunc(pEx
aff0: 70 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pr) );.    asser
b000: 74 28 20 70 57 69 6e 2d 3e 70 70 54 68 69 73 3d  t( pWin->ppThis=
b010: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
b020: 33 57 69 6e 64 6f 77 4c 69 6e 6b 28 70 53 65 6c  3WindowLink(pSel
b030: 65 63 74 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 0a  ect, pWin);.  }.
b040: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
b050: 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
b060: 69 6e 74 20 67 61 74 68 65 72 53 65 6c 65 63 74  int gatherSelect
b070: 57 69 6e 64 6f 77 73 53 65 6c 65 63 74 43 61 6c  WindowsSelectCal
b080: 6c 62 61 63 6b 28 57 61 6c 6b 65 72 20 2a 70 57  lback(Walker *pW
b090: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
b0a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d 70  ){.  return p==p
b0b0: 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63  Walker->u.pSelec
b0c0: 74 20 3f 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  t ? WRC_Continue
b0d0: 20 3a 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a   : WRC_Prune;.}.
b0e0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 61 74 68  static void gath
b0f0: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28  erSelectWindows(
b100: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61  Select *p){.  Wa
b110: 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70  lker w;.  w.xExp
b120: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74 68  rCallback = gath
b130: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 43  erSelectWindowsC
b140: 61 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78 53 65  allback;.  w.xSe
b150: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 67  lectCallback = g
b160: 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f  atherSelectWindo
b170: 77 73 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  wsSelectCallback
b180: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
b190: 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e  lback2 = 0;.  w.
b1a0: 70 50 61 72 73 65 20 3d 20 30 3b 0a 20 20 77 2e  pParse = 0;.  w.
b1b0: 75 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20  u.pSelect = p;. 
b1c0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
b1d0: 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 23 65 6e  ct(&w, p);.}.#en
b1e0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
b1f0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
b200: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
b210: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
b220: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
b230: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
b240: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
b250: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
b260: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
b270: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
b280: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
b290: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
b2a0: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
b2b0: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
b2c0: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
b2d0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
b2e0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
b2f0: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
b300: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
b310: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
b320: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
b330: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
b340: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
b350: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
b360: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
b370: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
b380: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
b390: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
b3a0: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
b3b0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
b3c0: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
b3d0: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
b3e0: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
b3f0: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
b400: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
b410: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
b420: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
b430: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
b440: 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  gs..** If the EX
b450: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
b460: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
b470: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  he structure ret
b480: 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72  urned is a.** tr
b490: 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20  uncated version 
b4a0: 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70  of the usual Exp
b4b0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
b4c0: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
b4d0: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  as.** part of th
b4e0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
b4f0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
b500: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
b510: 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  a..*/.Expr *sqli
b520: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
b530: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
b540: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
b550: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
b560: 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  || flags==EXPRDU
b570: 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65  P_REDUCE );.  re
b580: 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70  turn p ? exprDup
b590: 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30  (db, p, flags, 0
b5a0: 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73  ) : 0;.}.ExprLis
b5b0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
b5c0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
b5d0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  b, ExprList *p, 
b5e0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78  int flags){.  Ex
b5f0: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
b600: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
b610: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
b620: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
b630: 0a 20 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53  .  Expr *pPriorS
b640: 65 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20  electCol = 0;.  
b650: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
b660: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
b670: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
b680: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b690: 52 61 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65  RawNN(db, sqlite
b6a0: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
b6b0: 2c 20 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  , p));.  if( pNe
b6c0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
b6d0: 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d  .  pNew->nExpr =
b6e0: 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74   p->nExpr;.  pIt
b6f0: 65 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20  em = pNew->a;.  
b700: 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b  pOldItem = p->a;
b710: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
b720: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
b730: 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b  em++, pOldItem++
b740: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c  ){.    Expr *pOl
b750: 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d  dExpr = pOldItem
b760: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ->pExpr;.    Exp
b770: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
b780: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
b790: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b7a0: 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61  b, pOldExpr, fla
b7b0: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  gs);.    if( pOl
b7c0: 64 45 78 70 72 20 0a 20 20 20 20 20 26 26 20 70  dExpr .     && p
b7d0: 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  OldExpr->op==TK_
b7e0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20  SELECT_COLUMN.  
b7f0: 20 20 20 26 26 20 28 70 4e 65 77 45 78 70 72 20     && (pNewExpr 
b800: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21  = pItem->pExpr)!
b810: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
b820: 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70   assert( pNewExp
b830: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c  r->iColumn==0 ||
b840: 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66   i>0 );.      if
b850: 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c  ( pNewExpr->iCol
b860: 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
b870: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78    assert( pOldEx
b880: 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45  pr->pLeft==pOldE
b890: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20  xpr->pRight );. 
b8a0: 20 20 20 20 20 20 20 70 50 72 69 6f 72 53 65 6c         pPriorSel
b8b0: 65 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78 70  ectCol = pNewExp
b8c0: 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 45  r->pLeft = pNewE
b8d0: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
b8e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b8f0: 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
b900: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b910: 20 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72   pItem[-1].pExpr
b920: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
b930: 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d  ssert( pNewExpr-
b940: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b  >iColumn==pItem[
b950: 2d 31 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75  -1].pExpr->iColu
b960: 6d 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  mn+1 );.        
b970: 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 53 65  assert( pPriorSe
b980: 6c 65 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d  lectCol==pItem[-
b990: 31 5d 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  1].pExpr->pLeft 
b9a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 45  );.        pNewE
b9b0: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50 72  xpr->pLeft = pPr
b9c0: 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20 20  iorSelectCol;.  
b9d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b9e0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
b9f0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ba00: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
ba10: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
ba20: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
ba30: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
ba40: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
ba50: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 46 6c 61    pItem->sortFla
ba60: 67 73 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  gs = pOldItem->s
ba70: 6f 72 74 46 6c 61 67 73 3b 0a 20 20 20 20 70 49  ortFlags;.    pI
ba80: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
ba90: 20 20 20 70 49 74 65 6d 2d 3e 62 4e 75 6c 6c 73     pItem->bNulls
baa0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 4e 75   = pOldItem->bNu
bab0: 6c 6c 73 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  lls;.    pItem->
bac0: 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c  bSpanIsTab = pOl
bad0: 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  dItem->bSpanIsTa
bae0: 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53  b;.    pItem->bS
baf0: 6f 72 74 65 72 52 65 66 20 3d 20 70 4f 6c 64 49  orterRef = pOldI
bb00: 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 3b  tem->bSorterRef;
bb10: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20  .    pItem->u = 
bb20: 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d  pOldItem->u;.  }
bb30: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
bb40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73  }../*.** If curs
bb50: 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76  ors, triggers, v
bb60: 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
bb70: 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74  ies are all omit
bb80: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
bb90: 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  build, then none
bba0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
bbb0: 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65  g routines, exce
bbc0: 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74  pt for .** sqlit
bbd0: 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63  e3SelectDup(), c
bbe0: 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71  an be called. sq
bbf0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
bc00: 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a   is sometimes.**
bc10: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e   called with a N
bc20: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
bc30: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
bc40: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
bc50: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
bc60: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
bc70: 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28   \. || !defined(
bc80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
bc90: 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73  UERY).SrcList *s
bca0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
bcb0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
bcc0: 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  cList *p, int fl
bcd0: 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  ags){.  SrcList 
bce0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
bcf0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61    int nByte;.  a
bd00: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
bd10: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
bd20: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
bd30: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
bd40: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
bd50: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
bd60: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
bd70: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
bd80: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
bd90: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
bda0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
bdb0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
bdc0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
bdd0: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
bde0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
bdf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
be00: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
be10: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
be20: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
be30: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
be40: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
be50: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
be60: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
be70: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70  tem->pSchema = p
be80: 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61  OldItem->pSchema
be90: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
bea0: 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
beb0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
bec0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pOldItem->zDatab
bed0: 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ase);.    pNewIt
bee0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
bef0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
bf00: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
bf10: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
bf20: 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
bf30: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
bf40: 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  dItem->zAlias);.
bf50: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67      pNewItem->fg
bf60: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b   = pOldItem->fg;
bf70: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
bf80: 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65  Cursor = pOldIte
bf90: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
bfa0: 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69  pNewItem->addrFi
bfb0: 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d  llSub = pOldItem
bfc0: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20  ->addrFillSub;. 
bfd0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67     pNewItem->reg
bfe0: 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65  Return = pOldIte
bff0: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
c000: 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e    if( pNewItem->
c010: 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
c020: 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d  {.      pNewItem
c030: 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20  ->u1.zIndexedBy 
c040: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
c050: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c060: 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a  u1.zIndexedBy);.
c070: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
c080: 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70  em->pIBIndex = p
c090: 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65  OldItem->pIBInde
c0a0: 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49  x;.    if( pNewI
c0b0: 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
c0c0: 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49  c ){.      pNewI
c0d0: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
c0e0: 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71   = .          sq
c0f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c100: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75  (db, pOldItem->u
c110: 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61 67  1.pFuncArg, flag
c120: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  s);.    }.    pT
c130: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
c140: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
c150: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
c160: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
c170: 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20  ->nTabRef++;.   
c180: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
c190: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
c1a0: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
c1b0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
c1c0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  t, flags);.    p
c1d0: 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73  NewItem->pOn = s
c1e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
c1f0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c  , pOldItem->pOn,
c200: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c210: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
c220: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
c230: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
c240: 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77  Using);.    pNew
c250: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20  Item->colUsed = 
c260: 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pOldItem->colUse
c270: 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  d;.  }.  return 
c280: 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a  pNew;.}.IdList *
c290: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
c2a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
c2b0: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
c2c0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
c2d0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  i;.  assert( db!
c2e0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
c2f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
c300: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
c310: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
c320: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
c330: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
c340: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
c350: 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a  ->nId = p->nId;.
c360: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
c370: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
c380: 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  (db, p->nId*size
c390: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
c3a0: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
c3b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
c3c0: 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65 77 29  FreeNN(db, pNew)
c3d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
c3e0: 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68    }.  /* Note th
c3f0: 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73  at because the s
c400: 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  ize of the alloc
c410: 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d  ation for p->a[]
c420: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63   is not.  ** nec
c430: 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72  essarily a power
c440: 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33   of two, sqlite3
c450: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d  IdListAppend() m
c460: 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ay not be called
c470: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70  .  ** on the dup
c480: 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62  licate created b
c490: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
c4a0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
c4b0: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
c4c0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
c4d0: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
c4e0: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
c4f0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
c500: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
c510: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
c520: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
c530: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
c540: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c550: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
c560: 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64  Item->idx = pOld
c570: 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20  Item->idx;.  }. 
c580: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
c590: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
c5a0: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
c5b0: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 44   *db, Select *pD
c5c0: 75 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  up, int flags){.
c5d0: 20 20 53 65 6c 65 63 74 20 2a 70 52 65 74 20 3d    Select *pRet =
c5e0: 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e   0;.  Select *pN
c5f0: 65 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63  ext = 0;.  Selec
c600: 74 20 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a  t **pp = &pRet;.
c610: 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a 20 20    Select *p;..  
c620: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
c630: 0a 20 20 66 6f 72 28 70 3d 70 44 75 70 3b 20 70  .  for(p=pDup; p
c640: 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  ; p=p->pPrior){.
c650: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
c660: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c670: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
c680: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 69 66  of(*p) );.    if
c690: 28 20 70 4e 65 77 3d 3d 30 20 29 20 62 72 65 61  ( pNew==0 ) brea
c6a0: 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c  k;.    pNew->pEL
c6b0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
c6c0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
c6d0: 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a  pEList, flags);.
c6e0: 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d      pNew->pSrc =
c6f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
c700: 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20  up(db, p->pSrc, 
c710: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c720: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
c730: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
c740: 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b  >pWhere, flags);
c750: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  .    pNew->pGrou
c760: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
c770: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
c780: 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29  pGroupBy, flags)
c790: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76  ;.    pNew->pHav
c7a0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
c7b0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76  rDup(db, p->pHav
c7c0: 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ing, flags);.   
c7d0: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
c7e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
c7f0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64  tDup(db, p->pOrd
c800: 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  erBy, flags);.  
c810: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
c820: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e  op;.    pNew->pN
c830: 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20  ext = pNext;.   
c840: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
c850: 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69  0;.    pNew->pLi
c860: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mit = sqlite3Exp
c870: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  rDup(db, p->pLim
c880: 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  it, flags);.    
c890: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
c8a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66  ;.    pNew->iOff
c8b0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  set = 0;.    pNe
c8c0: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  w->selFlags = p-
c8d0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f  >selFlags & ~SF_
c8e0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
c8f0: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65     pNew->addrOpe
c900: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
c910: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65     pNew->addrOpe
c920: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
c930: 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74     pNew->nSelect
c940: 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74  Row = p->nSelect
c950: 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  Row;.    pNew->p
c960: 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64  With = withDup(d
c970: 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 23 69  b, p->pWith);.#i
c980: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c990: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
c9a0: 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b   pNew->pWin = 0;
c9b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44  .    pNew->pWinD
c9c0: 65 66 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e  efn = sqlite3Win
c9d0: 64 6f 77 4c 69 73 74 44 75 70 28 64 62 2c 20 70  dowListDup(db, p
c9e0: 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20 20 20  ->pWinDefn);.   
c9f0: 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 26 26 20   if( p->pWin && 
ca00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ca10: 3d 3d 30 20 29 20 67 61 74 68 65 72 53 65 6c 65  ==0 ) gatherSele
ca20: 63 74 57 69 6e 64 6f 77 73 28 70 4e 65 77 29 3b  ctWindows(pNew);
ca30: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 77  .#endif.    pNew
ca40: 2d 3e 73 65 6c 49 64 20 3d 20 70 2d 3e 73 65 6c  ->selId = p->sel
ca50: 49 64 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 4e  Id;.    *pp = pN
ca60: 65 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70 4e  ew;.    pp = &pN
ca70: 65 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  ew->pPrior;.    
ca80: 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
ca90: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
caa0: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
cab0: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
cac0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
cad0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66  Select *p, int f
cae0: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
caf0: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
cb00: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
cb10: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
cb20: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
cb30: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
cb40: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
cb50: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
cb60: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
cb70: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
cb80: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
cb90: 2a 2a 20 54 68 65 20 70 4c 69 73 74 20 61 72 67  ** The pList arg
cba0: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 69  ument must be ei
cbb0: 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 70  ther NULL or a p
cbc0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 45 78 70  ointer to an Exp
cbd0: 72 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69 6e 65  rList.** obtaine
cbe0: 64 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  d from a prior c
cbf0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 78  all to sqlite3Ex
cc00: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 2e 20  prListAppend(). 
cc10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
cc20: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
cc30: 20 77 69 74 68 20 61 6e 20 45 78 70 72 4c 69 73   with an ExprLis
cc40: 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
cc50: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
cc60: 75 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f 6e 3a  up()..** Reason:
cc70: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
cc80: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
cc90: 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  number of slots 
cca0: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a 2a 2a  in pList->a[].**
ccb0: 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74   is a power of t
ccc0: 77 6f 2e 20 20 54 68 61 74 20 69 73 20 74 72 75  wo.  That is tru
ccd0: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70  e for sqlite3Exp
cce0: 72 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 65  rListAppend() re
ccf0: 74 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69 73 20  turns.** but is 
cd00: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
cd10: 74 72 75 65 20 66 72 6f 6d 20 74 68 65 20 72 65  true from the re
cd20: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
cd30: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
cd40: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  ()..**.** If a m
cd50: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
cd60: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
cd70: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
cd80: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
cd90: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
cda0: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
cdb0: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
cdc0: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
cdd0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
cde0: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
cdf0: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
ce00: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
ce10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
ce20: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
ce30: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
ce40: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ce50: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
ce60: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
ce70: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
ce80: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
ce90: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
cea0: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
ceb0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
cec0: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
ced0: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
cee0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  LL */.){.  struc
cef0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
cf00: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
cf10: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
cf20: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
cf30: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
cf40: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
cf50: 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
cf60: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
cf70: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
cf80: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
cf90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
cfa0: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
cfb0: 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20     pList->nExpr 
cfc0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
cfd0: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26   (pList->nExpr &
cfe0: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31   (pList->nExpr-1
cff0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70  ))==0 ){.    Exp
d000: 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  rList *pNew;.   
d010: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
d020: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69  bRealloc(db, pLi
d030: 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 73 69  st, .         si
d040: 7a 65 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a  zeof(*pList)+(2*
d050: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
d060: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 2a 73  List->nExpr-1)*s
d070: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
d080: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ]));.    if( pNe
d090: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  w==0 ){.      go
d0a0: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
d0b0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
d0c0: 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  w;.  }.  pItem =
d0d0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
d0e0: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61 73  ->nExpr++];.  as
d0f0: 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73  sert( offsetof(s
d100: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
d110: 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65  tem,zName)==size
d120: 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  of(pItem->pExpr)
d130: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
d140: 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78  fsetof(struct Ex
d150: 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78 70  prList_item,pExp
d160: 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  r)==0 );.  memse
d170: 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  t(&pItem->zName,
d180: 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  0,sizeof(*pItem)
d190: 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74  -offsetof(struct
d1a0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a   ExprList_item,z
d1b0: 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d 2d  Name));.  pItem-
d1c0: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
d1d0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
d1e0: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
d1f0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
d200: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
d210: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
d220: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
d230: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
d240: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
d250: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
d260: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  st);.  return 0;
d270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d  .}../*.** pColum
d280: 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72  ns and pExpr for
d290: 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69 67  m a vector assig
d2a0: 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 70  nment which is p
d2b0: 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a  art of the SET.*
d2c0: 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55  * clause of an U
d2d0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
d2e0: 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
d2f0: 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63  **        (a,b,c
d300: 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32  ) = (expr1,expr2
d310: 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20  ,expr3).** Or:  
d320: 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c    (a,b,c) = (SEL
d330: 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e  ECT x,y,z FROM .
d340: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ...).**.** For e
d350: 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ach term of the 
d360: 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e  vector assignmen
d370: 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e  t, append new en
d380: 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  tries to the.** 
d390: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
d3a0: 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63  pList.  In the c
d3b0: 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65 72  ase of a subquer
d3c0: 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70  y on the RHS, ap
d3d0: 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43  pend.** TK_SELEC
d3e0: 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73  T_COLUMN express
d3f0: 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  ions..*/.ExprLis
d400: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
d410: 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a  stAppendVector(.
d420: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d430: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
d440: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
d450: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d460: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
d470: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
d480: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
d490: 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  L */.  IdList *p
d4a0: 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a  Columns,      /*
d4b0: 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f   List of names o
d4c0: 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73  f LHS of the ass
d4d0: 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  ignment */.  Exp
d4e0: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
d4f0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78      /* Vector ex
d500: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
d510: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
d520: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
d530: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d540: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
d550: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
d560: 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20   iFirst = pList 
d570: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
d580: 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e   0;.  /* pColumn
d590: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55  s can only be NU
d5a0: 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d  LL due to an OOM
d5b0: 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c   but an OOM will
d5c0: 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65   cause an.  ** e
d5d0: 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69  xit prior to thi
d5e0: 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20  s routine being 
d5f0: 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28  invoked */.  if(
d600: 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d   NEVER(pColumns=
d610: 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f  =0) ) goto vecto
d620: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a  r_append_error;.
d630: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
d640: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
d650: 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a  end_error;..  /*
d660: 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61   If the RHS is a
d670: 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65   vector, then we
d680: 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79   can immediately
d690: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
d6a0: 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a  at .  ** the siz
d6b0: 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64  e of the RHS and
d6c0: 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74   LHS match.  But
d6d0: 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 61   if the RHS is a
d6e0: 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77   SELECT, .  ** w
d6f0: 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20 69  ildcards ("*") i
d700: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
d710: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d   of the SELECT m
d720: 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
d730: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63  before.  ** we c
d740: 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63  an do the size c
d750: 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74  heck, so defer t
d760: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e  he size check un
d770: 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
d780: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
d790: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45  pExpr->op!=TK_SE
d7a0: 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73  LECT && pColumns
d7b0: 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65  ->nId!=(n=sqlite
d7c0: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
d7d0: 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73  pExpr)) ){.    s
d7e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d7f0: 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d  Parse, "%d colum
d800: 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76  ns assigned %d v
d810: 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20  alues",.        
d820: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
d830: 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20  umns->nId, n);. 
d840: 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61     goto vector_a
d850: 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d  ppend_error;.  }
d860: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
d870: 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b  Columns->nId; i+
d880: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53  +){.    Expr *pS
d890: 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ubExpr = sqlite3
d8a0: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
d8b0: 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ld(pParse, pExpr
d8c0: 2c 20 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , i);.    assert
d8d0: 28 20 70 53 75 62 45 78 70 72 21 3d 30 20 7c 7c  ( pSubExpr!=0 ||
d8e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d8f0: 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d );.    assert(
d900: 20 70 53 75 62 45 78 70 72 3d 3d 30 20 7c 7c 20   pSubExpr==0 || 
d910: 70 53 75 62 45 78 70 72 2d 3e 69 54 61 62 6c 65  pSubExpr->iTable
d920: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
d930: 53 75 62 45 78 70 72 3d 3d 30 20 29 20 63 6f 6e  SubExpr==0 ) con
d940: 74 69 6e 75 65 3b 0a 20 20 20 20 70 53 75 62 45  tinue;.    pSubE
d950: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43  xpr->iTable = pC
d960: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 20  olumns->nId;.   
d970: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
d980: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
d990: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53  Parse, pList, pS
d9a0: 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ubExpr);.    if(
d9b0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
d9c0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
d9d0: 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31  Expr==iFirst+i+1
d9e0: 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   );.      pList-
d9f0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
da00: 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75  1].zName = pColu
da10: 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  mns->a[i].zName;
da20: 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d  .      pColumns-
da30: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b  >a[i].zName = 0;
da40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
da50: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
da60: 6c 65 64 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  led && pExpr->op
da70: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 41  ==TK_SELECT && A
da80: 4c 57 41 59 53 28 70 4c 69 73 74 21 3d 30 29 20  LWAYS(pList!=0) 
da90: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 46 69  ){.    Expr *pFi
daa0: 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  rst = pList->a[i
dab0: 46 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20 20  First].pExpr;.  
dac0: 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74    assert( pFirst
dad0: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
dae0: 74 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d 54  t( pFirst->op==T
daf0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
db00: 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a 20  );.     .    /* 
db10: 53 74 6f 72 65 20 74 68 65 20 53 45 4c 45 43 54  Store the SELECT
db20: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 70 52   statement in pR
db30: 69 67 68 74 20 73 6f 20 69 74 20 77 69 6c 6c 20  ight so it will 
db40: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 0a  be deleted when.
db50: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78      ** sqlite3Ex
db60: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 29 20 69  prListDelete() i
db70: 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  s called */.    
db80: 70 46 69 72 73 74 2d 3e 70 52 69 67 68 74 20 3d  pFirst->pRight =
db90: 20 70 45 78 70 72 3b 0a 20 20 20 20 70 45 78 70   pExpr;.    pExp
dba0: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52  r = 0;..    /* R
dbb0: 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a 65  emember the size
dbc0: 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 69   of the LHS in i
dbd0: 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77 65  Table so that we
dbe0: 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74 0a   can check that.
dbf0: 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 61      ** the RHS a
dc00: 6e 64 20 4c 48 53 20 73 69 7a 65 73 20 6d 61 74  nd LHS sizes mat
dc10: 63 68 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67  ch during code g
dc20: 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  eneration. */.  
dc30: 20 20 70 46 69 72 73 74 2d 3e 69 54 61 62 6c 65    pFirst->iTable
dc40: 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64   = pColumns->nId
dc50: 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61 70  ;.  }..vector_ap
dc60: 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71  pend_error:.  sq
dc70: 6c 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e  lite3ExprUnmapAn
dc80: 64 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20  dDelete(pParse, 
dc90: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
dca0: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
dcb0: 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72  , pColumns);.  r
dcc0: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
dcd0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f  /*.** Set the so
dce0: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  rt order for the
dcf0: 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e   last element on
dd00: 20 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c   the given ExprL
dd10: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
dd20: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
dd30: 6f 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73  ortOrder(ExprLis
dd40: 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f  t *p, int iSortO
dd50: 72 64 65 72 2c 20 69 6e 74 20 65 4e 75 6c 6c 73  rder, int eNulls
dd60: 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
dd70: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
dd80: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
dd90: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
dda0: 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 0a   p->nExpr>0 );..
ddb0: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
ddc0: 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20  _SO_UNDEFINED<0 
ddd0: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  && SQLITE_SO_ASC
dde0: 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  ==0 && SQLITE_SO
ddf0: 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73  _DESC>0 );.  ass
de00: 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d  ert( iSortOrder=
de10: 3d 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46  =SQLITE_SO_UNDEF
de20: 49 4e 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  INED .       || 
de30: 69 53 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49  iSortOrder==SQLI
de40: 54 45 5f 53 4f 5f 41 53 43 20 0a 20 20 20 20 20  TE_SO_ASC .     
de50: 20 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d    || iSortOrder=
de60: 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20  =SQLITE_SO_DESC 
de70: 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
de80: 65 4e 75 6c 6c 73 3d 3d 53 51 4c 49 54 45 5f 53  eNulls==SQLITE_S
de90: 4f 5f 55 4e 44 45 46 49 4e 45 44 20 0a 20 20 20  O_UNDEFINED .   
dea0: 20 20 20 20 7c 7c 20 65 4e 75 6c 6c 73 3d 3d 53      || eNulls==S
deb0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 0a 20 20  QLITE_SO_ASC .  
dec0: 20 20 20 20 20 7c 7c 20 65 4e 75 6c 6c 73 3d 3d       || eNulls==
ded0: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 0a  SQLITE_SO_DESC .
dee0: 20 20 29 3b 0a 0a 20 20 70 49 74 65 6d 20 3d 20    );..  pItem = 
def0: 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31  &p->a[p->nExpr-1
df00: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ];.  assert( pIt
df10: 65 6d 2d 3e 62 4e 75 6c 6c 73 3d 3d 30 20 29 3b  em->bNulls==0 );
df20: 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64 65  .  if( iSortOrde
df30: 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44  r==SQLITE_SO_UND
df40: 45 46 49 4e 45 44 20 29 7b 0a 20 20 20 20 69 53  EFINED ){.    iS
df50: 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54  ortOrder = SQLIT
df60: 45 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d 0a 20 20  E_SO_ASC;.  }.  
df70: 70 49 74 65 6d 2d 3e 73 6f 72 74 46 6c 61 67 73  pItem->sortFlags
df80: 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65   = (u8)iSortOrde
df90: 72 3b 0a 0a 20 20 69 66 28 20 65 4e 75 6c 6c 73  r;..  if( eNulls
dfa0: 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45  !=SQLITE_SO_UNDE
dfb0: 46 49 4e 45 44 20 29 7b 0a 20 20 20 20 70 49 74  FINED ){.    pIt
dfc0: 65 6d 2d 3e 62 4e 75 6c 6c 73 20 3d 20 31 3b 0a  em->bNulls = 1;.
dfd0: 20 20 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64      if( iSortOrd
dfe0: 65 72 21 3d 65 4e 75 6c 6c 73 20 29 7b 0a 20 20  er!=eNulls ){.  
dff0: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 46      pItem->sortF
e000: 6c 61 67 73 20 7c 3d 20 4b 45 59 49 4e 46 4f 5f  lags |= KEYINFO_
e010: 4f 52 44 45 52 5f 42 49 47 4e 55 4c 4c 3b 0a 20  ORDER_BIGNULL;. 
e020: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e030: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
e040: 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65  st.a[].zName ele
e050: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
e060: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
e070: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
e080: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
e090: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
e0a0: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
e0b0: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
e0c0: 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f  .  But pName sho
e0d0: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
e0e0: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
e0f0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
e100: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
e110: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
e120: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
e130: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e140: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
e150: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e160: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e170: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e180: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
e190: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
e1a0: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
e1b0: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
e1c0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
e1d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
e1e0: 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  me to be added *
e1f0: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
e200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e210: 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65  rue to cause the
e220: 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75   name to be dequ
e230: 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  oted */.){.  ass
e240: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
e250: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
e260: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
e270: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
e280: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
e290: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
e2a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
e2b0: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
e2c0: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
e2d0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
e2e0: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
e2f0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
e300: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   );.    pItem->z
e310: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
e320: 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e  StrNDup(pParse->
e330: 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  db, pName->z, pN
e340: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28  ame->n);.    if(
e350: 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74   dequote ) sqlit
e360: 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d  e3Dequote(pItem-
e370: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
e380: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
e390: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
e3a0: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
e3b0: 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29  (pParse, (void*)
e3c0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 4e  pItem->zName, pN
e3d0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
e3e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
e3f0: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53   ExprList.a[].zS
e400: 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  pan element of t
e410: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
e420: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
e430: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
e440: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
e450: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
e460: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
e470: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53  M error.  But pS
e480: 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  pan should never
e490: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
e4a0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
e4b0: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
e4c0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
e4d0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
e4e0: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
e4f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e500: 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65  SetSpan(.  Parse
e510: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e520: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e530: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
e540: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
e550: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
e560: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
e570: 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  pan. */.  const 
e580: 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20  char *zStart,   
e590: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68    /* Start of th
e5a0: 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73  e span */.  cons
e5b0: 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20  t char *zEnd    
e5c0: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
e5d0: 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73  e span */.){.  s
e5e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e5f0: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
e600: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64  t( pList!=0 || d
e610: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
e620: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
e630: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
e640: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
e650: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
e660: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
e670: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
e680: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
e690: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e6a0: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
e6b0: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
e6c0: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
e6d0: 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74  bSpanDup(db, zSt
e6e0: 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a  art, zEnd);.  }.
e6f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
e700: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
e710: 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  pEList contains 
e720: 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74  more than iLimit
e730: 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65   elements,.** le
e740: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
e750: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
e760: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
e770: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
e780: 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  th(.  Parse *pPa
e790: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
e7a0: 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74  *pEList,.  const
e7b0: 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29   char *zObject.)
e7c0: 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61  {.  int mx = pPa
e7d0: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
e7e0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
e7f0: 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  UMN];.  testcase
e800: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
e810: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b  st->nExpr==mx );
e820: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
e830: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
e840: 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20  Expr==mx+1 );.  
e850: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
e860: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29  List->nExpr>mx )
e870: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e880: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
e890: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
e8a0: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
e8b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
e8c0: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
e8d0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
e8e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
e8f0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
e900: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
e910: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
e920: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
e930: 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
e940: 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74  >nExpr;.  struct
e950: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
e960: 70 49 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e  pItem =  pList->
e970: 61 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  a;.  assert( pLi
e980: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
e990: 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
e9a0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
e9b0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
e9c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e9d0: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  db, pItem->zName
e9e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e9f0: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
ea00: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
ea10: 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d  m++;.  }while( -
ea20: 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  -i>0 );.  sqlite
ea30: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c  3DbFreeNN(db, pL
ea40: 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ist);.}.void sql
ea50: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
ea60: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
ea70: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
ea80: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20  {.  if( pList ) 
ea90: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
eaa0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
eab0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
eac0: 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61   bitwise-OR of a
ead0: 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69  ll Expr.flags fi
eae0: 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65  elds in the give
eaf0: 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a  n.** ExprList..*
eb00: 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70  /.u32 sqlite3Exp
eb10: 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74  rListFlags(const
eb20: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
eb30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33  ){.  int i;.  u3
eb40: 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  2 m = 0;.  asser
eb50: 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
eb60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
eb70: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
eb80: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
eb90: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
eba0: 45 78 70 72 3b 0a 20 20 20 20 20 61 73 73 65 72  Expr;.     asser
ebb0: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
ebc0: 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e      m |= pExpr->
ebd0: 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74  flags;.  }.  ret
ebe0: 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn m;.}../*.** 
ebf0: 54 68 69 73 20 69 73 20 61 20 53 45 4c 45 43 54  This is a SELECT
ec00: 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66  -node callback f
ec10: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
ec20: 6e 20 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a  n walker that.**
ec30: 20 61 6c 77 61 79 73 20 22 66 61 69 6c 73 22 2e   always "fails".
ec40: 20 20 42 79 20 22 66 61 69 6c 22 20 69 6e 20 74    By "fail" in t
ec50: 68 69 73 20 63 61 73 65 2c 20 77 65 20 6d 65 61  his case, we mea
ec60: 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72  n set.** pWalker
ec70: 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20  ->eCode to zero 
ec80: 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a  and abort..**.**
ec90: 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69   This callback i
eca0: 73 20 75 73 65 64 20 62 79 20 6d 75 6c 74 69 70  s used by multip
ecb0: 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61  le expression wa
ecc0: 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lkers..*/.int sq
ecd0: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
ece0: 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ail(Walker *pWal
ecf0: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
ed00: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
ed10: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
ed20: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65  d);.  pWalker->e
ed30: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Code = 0;.  retu
ed40: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a  rn WRC_Abort;.}.
ed50: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
ed60: 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  put expression i
ed70: 73 20 61 6e 20 49 44 20 77 69 74 68 20 74 68 65  s an ID with the
ed80: 20 6e 61 6d 65 20 22 74 72 75 65 22 20 6f 72 20   name "true" or 
ed90: 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65 6e 20  "false".** then 
eda0: 63 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20  convert it into 
edb0: 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20  an TK_TRUEFALSE 
edc0: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 6e 6f  term.  Return no
edd0: 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74 68 65  n-zero if.** the
ede0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61 70 70   conversion happ
edf0: 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f 20 69  ened, and zero i
ee00: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
ee10: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 0a 2a   is unaltered..*
ee20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
ee30: 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 45  rIdToTrueFalse(E
ee40: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61  xpr *pExpr){.  a
ee50: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
ee60: 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78 70 72  ==TK_ID || pExpr
ee70: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
ee80: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
ee90: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
eea0: 20 45 50 5f 51 75 6f 74 65 64 29 0a 20 20 20 26   EP_Quoted).   &
eeb0: 26 20 28 73 71 6c 69 74 65 33 53 74 72 49 43 6d  & (sqlite3StrICm
eec0: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
eed0: 6e 2c 20 22 74 72 75 65 22 29 3d 3d 30 0a 20 20  n, "true")==0.  
eee0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53       || sqlite3S
eef0: 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
ef00: 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73 65 22 29  zToken, "false")
ef10: 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 70 45  ==0).  ){.    pE
ef20: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52 55  xpr->op = TK_TRU
ef30: 45 46 41 4c 53 45 3b 0a 20 20 20 20 45 78 70 72  EFALSE;.    Expr
ef40: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
ef50: 72 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  r, pExpr->u.zTok
ef60: 65 6e 5b 34 5d 3d 3d 30 20 3f 20 45 50 5f 49 73  en[4]==0 ? EP_Is
ef70: 54 72 75 65 20 3a 20 45 50 5f 49 73 46 61 6c 73  True : EP_IsFals
ef80: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
ef90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
efa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
efb0: 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
efc0: 61 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 45  a TK_TRUEFALSE E
efd0: 78 70 72 20 6e 6f 64 65 2e 20 20 52 65 74 75 72  xpr node.  Retur
efe0: 6e 20 31 20 69 66 20 69 74 20 69 73 20 54 52 55  n 1 if it is TRU
eff0: 45 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74  E.** and 0 if it
f000: 20 69 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e   is FALSE..*/.in
f010: 74 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  t sqlite3ExprTru
f020: 74 68 56 61 6c 75 65 28 63 6f 6e 73 74 20 45 78  thValue(const Ex
f030: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 70 45  pr *pExpr){.  pE
f040: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
f050: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 28 45 78  rSkipCollate((Ex
f060: 70 72 2a 29 70 45 78 70 72 29 3b 0a 20 20 61 73  pr*)pExpr);.  as
f070: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
f080: 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 29 3b  =TK_TRUEFALSE );
f090: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f0a0: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
f0b0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75 65 22  >u.zToken,"true"
f0c0: 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73  )==0.       || s
f0d0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
f0e0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 66  xpr->u.zToken,"f
f0f0: 61 6c 73 65 22 29 3d 3d 30 20 29 3b 0a 20 20 72  alse")==0 );.  r
f100: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 75 2e 7a  eturn pExpr->u.z
f110: 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a 0a  Token[4]==0;.}..
f120: 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  /*.** If pExpr i
f130: 73 20 61 6e 20 41 4e 44 20 6f 72 20 4f 52 20 65  s an AND or OR e
f140: 78 70 72 65 73 73 69 6f 6e 2c 20 74 72 79 20 74  xpression, try t
f150: 6f 20 73 69 6d 70 6c 69 66 79 20 69 74 20 62 79  o simplify it by
f160: 20 65 6c 69 6d 69 6e 61 74 69 6e 67 0a 2a 2a 20   eliminating.** 
f170: 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 61  terms that are a
f180: 6c 77 61 79 73 20 74 72 75 65 20 6f 72 20 66 61  lways true or fa
f190: 6c 73 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  lse.  Return the
f1a0: 20 73 69 6d 70 6c 69 66 69 65 64 20 65 78 70 72   simplified expr
f1b0: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 4f 72 20 72 65  ession..** Or re
f1c0: 74 75 72 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  turn the origina
f1d0: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 66 20  l expression if 
f1e0: 6e 6f 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f  no simplificatio
f1f0: 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  n is possible..*
f200: 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  *.** Examples:.*
f210: 2a 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30 29 20  *.**     (x<10) 
f220: 41 4e 44 20 74 72 75 65 20 20 20 20 20 20 20 20  AND true        
f230: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 28 78 3c          =>   (x<
f240: 31 30 29 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30  10).**     (x<10
f250: 29 20 41 4e 44 20 66 61 6c 73 65 20 20 20 20 20  ) AND false     
f260: 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 66            =>   f
f270: 61 6c 73 65 0a 2a 2a 20 20 20 20 20 28 78 3c 31  alse.**     (x<1
f280: 30 29 20 41 4e 44 20 28 79 3d 32 32 20 4f 52 20  0) AND (y=22 OR 
f290: 66 61 6c 73 65 29 20 20 20 20 20 3d 3e 20 20 20  false)     =>   
f2a0: 28 78 3c 31 30 29 20 41 4e 44 20 28 79 3d 32 32  (x<10) AND (y=22
f2b0: 29 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30 29 20  ).**     (x<10) 
f2c0: 41 4e 44 20 28 79 3d 32 32 20 4f 52 20 74 72 75  AND (y=22 OR tru
f2d0: 65 29 20 20 20 20 20 20 3d 3e 20 20 20 28 78 3c  e)      =>   (x<
f2e0: 31 30 29 0a 2a 2a 20 20 20 20 20 28 79 3d 32 32  10).**     (y=22
f2f0: 29 20 4f 52 20 74 72 75 65 20 20 20 20 20 20 20  ) OR true       
f300: 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74            =>   t
f310: 72 75 65 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  rue.*/.Expr *sql
f320: 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69  ite3ExprSimplifi
f330: 65 64 41 6e 64 4f 72 28 45 78 70 72 20 2a 70 45  edAndOr(Expr *pE
f340: 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  xpr){.  assert( 
f350: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 69 66  pExpr!=0 );.  if
f360: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f370: 41 4e 44 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  AND || pExpr->op
f380: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 45  ==TK_OR ){.    E
f390: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71  xpr *pRight = sq
f3a0: 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66  lite3ExprSimplif
f3b0: 69 65 64 41 6e 64 4f 72 28 70 45 78 70 72 2d 3e  iedAndOr(pExpr->
f3c0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 45 78 70  pRight);.    Exp
f3d0: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
f3e0: 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69 65 64  e3ExprSimplified
f3f0: 41 6e 64 4f 72 28 70 45 78 70 72 2d 3e 70 4c 65  AndOr(pExpr->pLe
f400: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ft);.    if( Exp
f410: 72 41 6c 77 61 79 73 54 72 75 65 28 70 4c 65 66  rAlwaysTrue(pLef
f420: 74 29 20 7c 7c 20 45 78 70 72 41 6c 77 61 79 73  t) || ExprAlways
f430: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
f440: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
f450: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  Expr->op==TK_AND
f460: 20 3f 20 70 52 69 67 68 74 20 3a 20 70 4c 65 66   ? pRight : pLef
f470: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
f480: 20 45 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   ExprAlwaysTrue(
f490: 70 52 69 67 68 74 29 20 7c 7c 20 45 78 70 72 41  pRight) || ExprA
f4a0: 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74  lwaysFalse(pLeft
f4b0: 29 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  ) ){.      pExpr
f4c0: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
f4d0: 5f 41 4e 44 20 3f 20 70 4c 65 66 74 20 3a 20 70  _AND ? pLeft : p
f4e0: 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Right;.    }.  }
f4f0: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
f500: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  .}.../*.** These
f510: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
f520: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75  lker callbacks u
f530: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70  sed to check exp
f540: 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73  ressions to.** s
f550: 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22  ee if they are "
f560: 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f  constant" for so
f570: 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  me definition of
f580: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a   constant.  The.
f590: 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  ** Walker.eCode 
f5a0: 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73  value determines
f5b0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f   the type of "co
f5c0: 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c  nstant" we are l
f5d0: 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a  ooking.** for..*
f5e0: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
f5f0: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
f600: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
f610: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
f620: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
f630: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
f640: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
f650: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f660: 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71  ode==1.**     sq
f670: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f680: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20  antNotJoin()    
f690: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
f6a0: 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20  eCode==2.**     
f6b0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
f6c0: 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  leConstant()    
f6d0: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
f6e0: 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20  ->eCode==3.**   
f6f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
f700: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
f710: 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b  n()        pWalk
f720: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
f730: 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63  5.**.** In all c
f740: 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61  ases, the callba
f750: 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65  cks set Walker.e
f760: 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74  Code=0 and abort
f770: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
f780: 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74  on.** is found t
f790: 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74  o not be a const
f7a0: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ant..**.** The s
f7b0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
f7c0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
f7d0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61   is used for eva
f7e0: 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69  luating expressi
f7f0: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ons.** in a CREA
f800: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
f810: 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e  nt.  The Walker.
f820: 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35  eCode value is 5
f830: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
f840: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
f850: 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70  ema and 4 when p
f860: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
f870: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
f880: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
f890: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
f8a0: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
f8b0: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
f8c0: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
f8d0: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
f8e0: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
f8f0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
f900: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
f910: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
f920: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
f930: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
f940: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
f950: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
f960: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
f970: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
f980: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
f990: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
f9a0: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
f9b0: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
f9c0: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
f9d0: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
f9e0: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
f9f0: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
fa00: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
fa10: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73  Walker->eCode is
fa20: 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   2 then any term
fa30: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
fa40: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
fa50: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
fa60: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
fa70: 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64  of a left join d
fa80: 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20  isqualifies the 
fa90: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
faa0: 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69  from being consi
fab0: 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20  dered constant. 
fac0: 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  */.  if( pWalker
fad0: 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78  ->eCode==2 && Ex
fae0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
faf0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
fb00: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
fb10: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
fb20: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
fb30: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
fb40: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
fb50: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
fb60: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
fb70: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
fb80: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
fb90: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
fba0: 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57  ** and either pW
fbb0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
fbc0: 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63  or 5 or the func
fbd0: 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20  tion has the.   
fbe0: 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ** SQLITE_FUNC_
fbf0: 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20  CONST flag. */. 
fc00: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
fc10: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
fc20: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34  Walker->eCode>=4
fc30: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
fc40: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
fc50: 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  stFunc) ){.     
fc60: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
fc70: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
fc80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61  lse{.        pWa
fc90: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
fca0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fcb0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
fcc0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
fcd0: 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  D:.      /* Conv
fce0: 65 72 74 20 22 74 72 75 65 22 20 6f 72 20 22 66  ert "true" or "f
fcf0: 61 6c 73 65 22 20 69 6e 20 61 20 44 45 46 41 55  alse" in a DEFAU
fd00: 4c 54 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 74  LT clause into t
fd10: 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 70 70 72  he.      ** appr
fd20: 6f 70 72 69 61 74 65 20 54 4b 5f 54 52 55 45 46  opriate TK_TRUEF
fd30: 41 4c 53 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ALSE operator */
fd40: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
fd50: 65 33 45 78 70 72 49 64 54 6f 54 72 75 65 46 61  e3ExprIdToTrueFa
fd60: 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
fd70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
fd80: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
fd90: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
fda0: 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
fdb0: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
fdc0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
fdd0: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
fde0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
fdf0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
fe00: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
fe10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
fe20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
fe30: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
fe40: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fe50: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
fe60: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
fe70: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
fe80: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
fe90: 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
fea0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
feb0: 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20  r, EP_FixedCol) 
fec0: 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  && pWalker->eCod
fed0: 65 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=2 ){.        
fee0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
fef0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
ff00: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
ff10: 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78 70  eCode==3 && pExp
ff20: 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
ff30: 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20  er->u.iCur ){.  
ff40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
ff50: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
ff60: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
ff70: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20   through */.    
ff80: 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  case TK_IF_NULL_
ff90: 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ROW:.    case TK
ffa0: 5f 52 45 47 49 53 54 45 52 3a 0a 20 20 20 20 20  _REGISTER:.     
ffb0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
ffc0: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
ffd0: 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
ffe0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
fff0: 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29  TK_IF_NULL_ROW )
10000 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d  ;.      pWalker-
10010 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
10020 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
10030 72 74 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  rt;.    case TK_
10040 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
10050 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
10060 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  de==5 ){.       
10070 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e   /* Silently con
10080 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72 61 6d  vert bound param
10090 65 74 65 72 73 20 74 68 61 74 20 61 70 70 65 61  eters that appea
100a0 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52 45 41  r inside of CREA
100b0 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  TE.        ** st
100c0 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20  atements into a 
100d0 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73 69 6e  NULL when parsin
100e0 67 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  g the CREATE sta
100f0 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75 74 0a  tement text out.
10100 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
10110 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
10120 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
10130 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
10140 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  NULL;.      }els
10150 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65  e if( pWalker->e
10160 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20  Code==4 ){.     
10170 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61     /* A bound pa
10180 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43 52 45  rameter in a CRE
10190 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ATE statement th
101a0 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
101b0 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71  om.        ** sq
101c0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
101d0 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72 20  causes an error 
101e0 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  */.        pWalk
101f0 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
10200 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
10210 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
10220 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
10230 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64 65  hrough */.    de
10240 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73  fault:.      tes
10250 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
10260 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f  ==TK_SELECT ); /
10270 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  * sqlite3SelectW
10280 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61 6c 6c  alkFail() disall
10290 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  ows */.      tes
102a0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
102b0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f  ==TK_EXISTS ); /
102c0 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  * sqlite3SelectW
102d0 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61 6c 6c  alkFail() disall
102e0 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ows */.      ret
102f0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
10300 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69  ;.  }.}.static i
10310 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45  nt exprIsConst(E
10320 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74  xpr *p, int init
10330 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29 7b  Flag, int iCur){
10340 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
10350 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61  .eCode = initFla
10360 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  g;.  w.xExprCall
10370 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49  back = exprNodeI
10380 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78  sConstant;.  w.x
10390 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
103a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
103b0 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20 53  lkFail;.#ifdef S
103c0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77 2e  QLITE_DEBUG.  w.
103d0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
103e0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
103f0 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e  WalkAssert2;.#en
10400 64 69 66 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d  dif.  w.u.iCur =
10410 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33   iCur;.  sqlite3
10420 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
10430 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
10440 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
10450 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
10460 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
10470 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
10480 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
10490 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
104a0 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
104b0 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
104c0 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
104d0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
104e0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
104f0 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
10500 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
10510 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
10520 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
10530 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
10540 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
10550 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
10560 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
10570 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
10580 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
10590 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
105a0 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a  Const(p, 1, 0);.
105b0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
105c0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
105d0 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
105e0 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20 20 28 31  ro if.**.**   (1
105f0 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  ) the expression
10600 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 61 6e   is constant, an
10610 64 0a 2a 2a 20 20 20 28 32 29 20 74 68 65 20 65  d.**   (2) the e
10620 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6f  xpression does o
10630 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
10640 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
10650 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61  se.**       of a
10660 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 0a   LEFT JOIN, and.
10670 2a 2a 20 20 20 28 33 29 20 74 68 65 20 65 78 70  **   (3) the exp
10680 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
10690 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 45 50 5f   contain any EP_
106a0 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43 4f 4c 55  FixedCol TK_COLU
106b0 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f 70 65 72  MN.**       oper
106c0 61 6e 64 73 20 63 72 65 61 74 65 64 20 62 79 20  ands created by 
106d0 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f  the constant pro
106e0 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a  pagation optimiz
106f0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ation..**.** Whe
10700 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
10710 65 74 75 72 6e 73 20 74 72 75 65 2c 20 69 74 20  eturns true, it 
10720 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
10730 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
10740 20 63 61 6e 20 62 65 20 61 64 64 65 64 20 74 6f   can be added to
10750 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 43 6f   the pParse->pCo
10760 6e 73 74 45 78 70 72 20 6c 69 73 74 20 61 6e 64  nstExpr list and
10770 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20   evaluated once 
10780 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 72 65 70  when.** the prep
10790 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 73  ared statement s
107a0 74 61 72 74 73 20 75 70 2e 20 20 53 65 65 20 73  tarts up.  See s
107b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
107c0 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  Init()..*/.int s
107d0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
107e0 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72  tantNotJoin(Expr
107f0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
10800 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c  xprIsConst(p, 2,
10810 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   0);.}../*.** Wa
10820 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
10830 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
10840 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
10850 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
10860 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79  stant.** for any
10870 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
10880 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
10890 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f  rsor iCur.  In o
108a0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a  ther words, the.
108b0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  ** expression mu
108c0 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  st not refer to 
108d0 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  any non-determin
108e0 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e  istic function n
108f0 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20  or any.** table 
10900 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e  other than iCur.
10910 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
10920 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
10930 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  nt(Expr *p, int 
10940 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  iCur){.  return 
10950 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
10960 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , iCur);.}.../*.
10970 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ** sqlite3WalkEx
10980 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73  pr() callback us
10990 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  ed by sqlite3Exp
109a0 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  rIsConstantOrGro
109b0 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  upBy()..*/.stati
109c0 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
109d0 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
109e0 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  y(Walker *pWalke
109f0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
10a00 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
10a10 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b 65 72 2d  oupBy = pWalker-
10a20 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69  >u.pGroupBy;.  i
10a30 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  nt i;..  /* Chec
10a40 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 69 64  k if pExpr is id
10a50 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79 20 47  entical to any G
10a60 52 4f 55 50 20 42 59 20 74 65 72 6d 2e 20 49 66  ROUP BY term. If
10a70 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a 20 20   so, consider.  
10a80 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74 2e 20  ** it constant. 
10a90 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
10aa0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
10ab0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
10ac0 20 2a 70 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e   *p = pGroupBy->
10ad0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
10ae0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
10af0 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72 2c  ompare(0, pExpr,
10b00 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20   p, -1)<2 ){.   
10b10 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
10b20 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e  l = sqlite3ExprN
10b30 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72  NCollSeq(pWalker
10b40 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  ->pParse, p);.  
10b50 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
10b60 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c 29 20 29  sBinary(pColl) )
10b70 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
10b80 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
10b90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10ba0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78   /* Check if pEx
10bb0 70 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  pr is a sub-sele
10bc0 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69  ct. If so, consi
10bd0 64 65 72 20 69 74 20 76 61 72 69 61 62 6c 65 2e  der it variable.
10be0 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61   */.  if( ExprHa
10bf0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
10c00 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
10c10 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
10c20 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65  Code = 0;.    re
10c30 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
10c40 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 65 78    }..  return ex
10c50 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
10c60 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29  (pWalker, pExpr)
10c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
10c80 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
10c90 72 65 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ree passed as th
10ca0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
10cb0 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  . Return non-zer
10cc0 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72  o.** if the expr
10cd0 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20  ession consists 
10ce0 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73  entirely of cons
10cf0 74 61 6e 74 73 20 6f 72 20 63 6f 70 69 65 73 20  tants or copies 
10d00 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20  of terms .** in 
10d10 70 47 72 6f 75 70 42 79 20 74 68 61 74 20 73 6f  pGroupBy that so
10d20 72 74 20 77 69 74 68 20 74 68 65 20 42 49 4e 41  rt with the BINA
10d30 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  RY collation seq
10d40 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  uence..**.** Thi
10d50 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
10d60 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
10d70 66 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  f a term of the 
10d80 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 63 61  HAVING clause ca
10d90 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64  n.** be promoted
10da0 20 69 6e 74 6f 20 74 68 65 20 57 48 45 52 45 20   into the WHERE 
10db0 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64 65  clause.  In orde
10dc0 72 20 66 6f 72 20 73 75 63 68 20 61 20 70 72 6f  r for such a pro
10dd0 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a  motion to work,.
10de0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
10df0 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
10e00 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74  e term must be t
10e10 68 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20  he same for all 
10e20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20  members of.** a 
10e30 22 67 72 6f 75 70 22 2e 20 20 54 68 65 20 72 65  "group".  The re
10e40 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
10e50 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
10e60 20 6d 75 73 74 20 62 65 20 42 49 4e 41 52 59 0a   must be BINARY.
10e70 2a 2a 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ** assumes that 
10e80 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69  no other collati
10e90 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  ng sequence will
10ea0 20 68 61 76 65 20 61 20 66 69 6e 65 72 2d 67 72   have a finer-gr
10eb0 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e  ained.** groupin
10ec0 67 20 74 68 61 6e 20 62 69 6e 61 72 79 2e 20 20  g than binary.  
10ed0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 28  In other words (
10ee0 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61  A=B COLLATE bina
10ef0 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41  ry) implies.** A
10f00 3d 42 20 69 6e 20 65 76 65 72 79 20 6f 74 68 65  =B in every othe
10f10 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  r collating sequ
10f20 65 6e 63 65 2e 20 20 54 68 65 20 72 65 71 75 69  ence.  The requi
10f30 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 0a  rement that the.
10f40 2a 2a 20 47 52 4f 55 50 20 42 59 20 62 65 20 42  ** GROUP BY be B
10f50 49 4e 41 52 59 20 69 73 20 73 74 72 69 63 74 65  INARY is stricte
10f60 72 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  r than necessary
10f70 2e 20 20 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f  .  It would also
10f80 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d   work.** to prom
10f90 6f 74 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  ote HAVING claus
10fa0 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
10fb0 73 61 6d 65 20 61 6c 74 65 72 6e 61 74 69 76 65  same alternative
10fc0 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
10fd0 71 75 65 6e 63 65 20 61 73 20 74 68 65 20 47 52  quence as the GR
10fe0 4f 55 50 20 42 59 20 74 65 72 6d 2c 20 62 75 74  OUP BY term, but
10ff0 20 74 68 61 74 20 69 73 20 6d 75 63 68 20 68 61   that is much ha
11000 72 64 65 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a  rder to check,.*
11010 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * alternative co
11020 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11030 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20  s are uncommon, 
11040 61 6e 64 20 74 68 69 73 20 69 73 20 6f 6e 6c 79  and this is only
11050 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74   an.** optimizat
11060 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b 65 20  ion, so we take 
11070 74 68 65 20 65 61 73 79 20 77 61 79 20 6f 75 74  the easy way out
11080 20 61 6e 64 20 73 69 6d 70 6c 79 20 72 65 71 75   and simply requ
11090 69 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50  ire the.** GROUP
110a0 20 42 59 20 74 6f 20 75 73 65 20 74 68 65 20 42   BY to use the B
110b0 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20  INARY collating 
110c0 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74  sequence..*/.int
110d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
110e0 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28  nstantOrGroupBy(
110f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
11100 78 70 72 20 2a 70 2c 20 45 78 70 72 4c 69 73 74  xpr *p, ExprList
11110 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20 20 57   *pGroupBy){.  W
11120 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
11130 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
11140 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
11150 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72  NodeIsConstantOr
11160 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78 53 65  GroupBy;.  w.xSe
11170 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30  lectCallback = 0
11180 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70 42 79  ;.  w.u.pGroupBy
11190 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 77   = pGroupBy;.  w
111a0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
111b0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
111c0 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
111d0 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a  turn w.eCode;.}.
111e0 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
111f0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
11200 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
11210 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
11220 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
11230 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20  * or a function 
11240 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61  call with consta
11250 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
11260 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74  eturn and 0 if t
11270 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20  here.** are any 
11280 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
11290 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
112a0 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
112b0 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
112c0 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
112d0 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
112e0 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
112f0 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
11300 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
11310 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
11320 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
11330 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
11340 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
11350 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69  on(Expr *p, u8 i
11360 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74  sInit){.  assert
11370 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69  ( isInit==0 || i
11380 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65  sInit==1 );.  re
11390 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
113a0 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29  (p, 4+isInit, 0)
113b0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
113c0 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
113d0 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c  _HINTS./*.** Wal
113e0 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
113f0 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
11400 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
11410 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  n contains a.** 
11420 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65  subquery of some
11430 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30   kind.  Return 0
11440 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
11450 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a   subqueries..*/.
11460 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
11470 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79 28  ontainsSubquery(
11480 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b  Expr *p){.  Walk
11490 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
114a0 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  = 1;.  w.xExprCa
114b0 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
114c0 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  ExprWalkNoop;.  
114d0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
114e0 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
114f0 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65  tWalkFail;.#ifde
11500 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
11510 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
11520 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ck2 = sqlite3Sel
11530 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a  ectWalkAssert2;.
11540 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
11550 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
11560 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
11570 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  e==0;.}.#endif..
11580 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
11590 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20  ression p codes 
115a0 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
115b0 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  er that is small
115c0 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69   enough.** to fi
115d0 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  t in a 32-bit in
115e0 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20  teger, return 1 
115f0 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75  and put the valu
11600 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
11610 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20  .** in *pValue. 
11620 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
11630 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  on is not an int
11640 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73  eger or if it is
11650 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66   too big.** to f
11660 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  it in a signed 3
11670 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
11680 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76  eturn 0 and leav
11690 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e  e *pValue unchan
116a0 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
116b0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
116c0 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
116d0 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63  Value){.  int rc
116e0 20 3d 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45   = 0;.  if( NEVE
116f0 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
11700 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20   0;  /* Used to 
11710 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c  only happen foll
11720 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a  owing on OOM */.
11730 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72  .  /* If an expr
11740 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74  ession is an int
11750 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61  eger literal tha
11760 74 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e  t fits in a sign
11770 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69  ed 32-bit.  ** i
11780 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65  nteger, then the
11790 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
117a0 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  g will have alre
117b0 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a  ady been set */.
117c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
117d0 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28  =TK_INTEGER || (
117e0 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
117f0 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20  tValue)!=0.     
11800 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
11810 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54  GetInt32(p->u.zT
11820 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b  oken, &rc)==0 );
11830 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ..  if( p->flags
11840 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
11850 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20  {.    *pValue = 
11860 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  p->u.iValue;.   
11870 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
11880 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
11890 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  {.    case TK_UP
118a0 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  LUS: {.      rc 
118b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  = sqlite3ExprIsI
118c0 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
118d0 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   pValue);.      
118e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
118f0 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
11900 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
11910 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11920 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
11930 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
11940 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11950 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d  v!=(-2147483647-
11960 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  1) );.        *p
11970 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20  Value = -v;.    
11980 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
11990 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
119a0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
119b0 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  lt: break;.  }. 
119c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
119d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  *.** Return FALS
119e0 45 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  E if there is no
119f0 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
11a00 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
11a10 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  be NULL..**.** I
11a20 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
11a30 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f   might be NULL o
11a40 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  r if the express
11a50 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c  ion is too compl
11a60 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65  ex.** to tell re
11a70 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a  turn TRUE.  .**.
11a80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11a90 69 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70  is used as an op
11aa0 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73  timization, to s
11ab0 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70  kip OP_IsNull op
11ac0 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65  codes.** when we
11ad0 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c   know that a val
11ae0 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  ue cannot be NUL
11af0 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c  L.  Hence, a fal
11b00 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28  se positive.** (
11b10 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77  returning TRUE w
11b20 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20  hen in fact the 
11b30 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e  expression can n
11b40 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69  ever be NULL) mi
11b50 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c  ght.** be a smal
11b60 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  l performance hi
11b70 74 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  t but is otherwi
11b80 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e  se harmless.  On
11b90 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61   the other.** ha
11ba0 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61  nd, a false nega
11bb0 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20  tive (returning 
11bc0 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72  FALSE when the r
11bd0 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e  esult could be N
11be0 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b  ULL).** will lik
11bf0 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ely result in an
11c00 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65   incorrect answe
11c10 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64  r.  So when in d
11c20 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  oubt, return.** 
11c30 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  TRUE..*/.int sql
11c40 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
11c50 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29  l(const Expr *p)
11c60 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69  {.  u8 op;.  whi
11c70 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
11c80 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LUS || p->op==TK
11c90 5f 55 4d 49 4e 55 53 20 29 7b 0a 20 20 20 20 70  _UMINUS ){.    p
11ca0 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d   = p->pLeft;.  }
11cb0 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
11cc0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
11cd0 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
11ce0 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
11cf0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
11d00 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
11d10 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
11d20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
11d30 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
11d40 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
11d50 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
11d60 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 72 65 74 75  LUMN:.      retu
11d70 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  rn ExprHasProper
11d80 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75  ty(p, EP_CanBeNu
11d90 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ll) ||.         
11da0 20 20 20 20 70 2d 3e 79 2e 70 54 61 62 3d 3d 30      p->y.pTab==0
11db0 20 7c 7c 20 20 2f 2a 20 52 65 66 65 72 65 6e 63   ||  /* Referenc
11dc0 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  e to column of i
11dd0 6e 64 65 78 20 6f 6e 20 65 78 70 72 65 73 73 69  ndex on expressi
11de0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
11df0 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d     (p->iColumn>=
11e00 30 20 26 26 20 70 2d 3e 79 2e 70 54 61 62 2d 3e  0 && p->y.pTab->
11e10 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d  aCol[p->iColumn]
11e20 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20  .notNull==0);.  
11e30 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
11e40 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
11e50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
11e60 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
11e70 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
11e80 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20   constant which 
11e90 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68  would be.** unch
11ea0 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69  anged by OP_Affi
11eb0 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66  nity with the af
11ec0 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20  finity given in 
11ed0 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
11ee0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
11ef0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
11f00 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
11f10 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  if the OP_Affini
11f20 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ty operation.** 
11f30 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
11f40 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72   When in doubt r
11f50 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20  eturn FALSE.  A 
11f60 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a  false negative.*
11f70 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  * is harmless.  
11f80 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  A false positive
11f90 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72  , however, can r
11fa0 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f  esult in the wro
11fb0 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f  ng.** answer..*/
11fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11fd0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
11fe0 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72  hange(const Expr
11ff0 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a   *p, char aff){.
12000 20 20 75 38 20 6f 70 3b 0a 20 20 69 6e 74 20 75    u8 op;.  int u
12010 6e 61 72 79 4d 69 6e 75 73 20 3d 20 30 3b 0a 20  naryMinus = 0;. 
12020 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45   if( aff==SQLITE
12030 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75  _AFF_BLOB ) retu
12040 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 1;.  while( p
12050 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
12060 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
12070 55 53 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  US ){.    if( p-
12080 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
12090 20 75 6e 61 72 79 4d 69 6e 75 73 20 3d 20 31 3b   unaryMinus = 1;
120a0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66  .    p = p->pLef
120b0 74 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  t;.  }.  op = p-
120c0 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
120d0 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
120e0 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
120f0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
12100 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
12110 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
12120 66 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f>=SQLITE_AFF_NU
12130 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
12140 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
12150 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
12160 66 66 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff>=SQLITE_AFF_N
12170 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
12180 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
12190 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
121a0 20 21 75 6e 61 72 79 4d 69 6e 75 73 20 26 26 20   !unaryMinus && 
121b0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
121c0 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TEXT;.    }.    
121d0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
121e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 21 75 6e        return !un
121f0 61 72 79 4d 69 6e 75 73 3b 0a 20 20 20 20 7d 0a  aryMinus;.    }.
12200 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
12210 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  MN: {.      asse
12220 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30  rt( p->iTable>=0
12230 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74   );  /* p cannot
12240 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48   be part of a CH
12250 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ECK constraint *
12260 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  /.      return a
12270 66 66 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff>=SQLITE_AFF_N
12280 55 4d 45 52 49 43 20 26 26 20 70 2d 3e 69 43 6f  UMERIC && p->iCo
12290 6c 75 6d 6e 3c 30 3b 0a 20 20 20 20 7d 0a 20 20  lumn<0;.    }.  
122a0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
122b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
122c0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
122d0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
122e0 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
122f0 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75  is a row-id colu
12300 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  mn name..*/.int 
12310 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63  sqlite3IsRowid(c
12320 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
12330 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
12340 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
12350 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
12360 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
12370 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  rICmp(z, "ROWID"
12380 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
12390 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
123a0 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d  rICmp(z, "OID")=
123b0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
123c0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
123d0 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20 52 48  .** pX is the RH
123e0 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  S of an IN opera
123f0 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73 20 61  tor.  If pX is a
12400 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
12410 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62  t .** that can b
12420 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20  e simplified to 
12430 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 61  a direct table a
12440 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75  ccess, then retu
12450 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
12460 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  to the SELECT st
12470 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20  atement.  If pX 
12480 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  is not a SELECT 
12490 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72  statement,.** or
124a0 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   if the SELECT s
124b0 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74  tatement needs t
124c0 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20  o be manifested 
124d0 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74  into a transient
124e0 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  .** table, then 
124f0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
12500 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12510 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61  MIT_SUBQUERY.sta
12520 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61  tic Select *isCa
12530 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
12540 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c  Expr *pX){.  Sel
12550 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73  ect *p;.  SrcLis
12560 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
12570 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
12580 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
12590 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72  t i;.  if( !Expr
125a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
125b0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20  EP_xIsSelect) ) 
125c0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f  return 0;  /* No
125d0 74 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  t a subquery */.
125e0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
125f0 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72  perty(pX, EP_Var
12600 53 65 6c 65 63 74 29 20 20 29 20 72 65 74 75 72  Select)  ) retur
12610 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61  n 0;  /* Correla
12620 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20  ted subq */.  p 
12630 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  = pX->x.pSelect;
12640 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
12650 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
12660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
12670 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
12680 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  CT */.  if( p->s
12690 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
126a0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
126b0 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74  ate) ){.    test
126c0 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
126d0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
126e0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
126f0 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
12700 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
12710 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
12720 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
12730 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
12740 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72  gregate );.    r
12750 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44  eturn 0; /* No D
12760 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
12770 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65  and no aggregate
12780 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
12790 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
127a0 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20  GroupBy==0 );   
127b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
127c0 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
127d0 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
127e0 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
127f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12800 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54   /* Has no LIMIT
12810 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
12820 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
12830 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12840 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48      /* Has no WH
12850 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
12860 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
12870 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
12880 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  0 );.  if( pSrc-
12890 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
128a0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
128b0 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   Single term in 
128c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
128d0 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
128e0 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
128f0 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20   0;     /* FROM 
12900 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  is not a subquer
12910 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70  y or view */.  p
12920 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
12930 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  .pTab;.  assert(
12940 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
12950 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c  sert( pTab->pSel
12960 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ect==0 );       
12970 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
12980 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65  use is not a vie
12990 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72  w */.  if( IsVir
129a0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
129b0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  urn 0;        /*
129c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74   FROM clause not
129d0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
129e0 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
129f0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65  ->pEList;.  asse
12a00 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
12a10 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54  .  /* All SELECT
12a20 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65   results must be
12a30 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66   columns. */.  f
12a40 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
12a50 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12a60 20 20 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20     Expr *pRes = 
12a70 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
12a80 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73  pr;.    if( pRes
12a90 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
12aa0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
12ab0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54  assert( pRes->iT
12ac0 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d  able==pSrc->a[0]
12ad0 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20  .iCursor );  /* 
12ae0 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64  Not a correlated
12af0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d   subquery */.  }
12b00 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23  .  return p;.}.#
12b10 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12b20 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
12b30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12b40 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
12b50 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12b60 64 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74  de that checks t
12b70 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  he left-most col
12b80 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62  umn of index tab
12b90 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69  le iCur to see i
12ba0 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73  f.** it contains
12bb0 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65   any NULL entrie
12bc0 73 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65  s.  Cause the re
12bd0 67 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73  gister at regHas
12be0 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a  Null to be set.*
12bf0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * to a non-NULL 
12c00 76 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f  value if iCur co
12c10 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e  ntains no NULLs.
12c20 20 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72    Cause register
12c30 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74   regHasNull.** t
12c40 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  o be set to NULL
12c50 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
12c60 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
12c70 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  LL values..*/.st
12c80 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
12c90 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
12ca0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75  Vdbe *v, int iCu
12cb0 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c  r, int regHasNul
12cc0 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b  l){.  int addr1;
12cd0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12ce0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
12cf0 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  er, 0, regHasNul
12d00 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  l);.  addr1 = sq
12d10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
12d20 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
12d30 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
12d40 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
12d50 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12d60 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c  Column, iCur, 0,
12d70 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
12d80 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
12d90 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
12da0 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65  PEOFARG);.  Vdbe
12db0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72  Comment((v, "fir
12dc0 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22  st_entry_in(%d)"
12dd0 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69  , iCur));.  sqli
12de0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
12df0 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e  v, addr1);.}.#en
12e00 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
12e10 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
12e20 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  RY./*.** The arg
12e30 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f  ument is an IN o
12e40 70 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c  perator with a l
12e50 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75  ist (not a subqu
12e60 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ery) on the .** 
12e70 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e  right-hand side.
12e80 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
12e90 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f   that list is co
12ea0 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  nstant..*/.stati
12eb0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52  c int sqlite3InR
12ec0 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70  hsIsConstant(Exp
12ed0 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20  r *pIn){.  Expr 
12ee0 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73  *pLHS;.  int res
12ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
12f00 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e  rHasProperty(pIn
12f10 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
12f20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d  );.  pLHS = pIn-
12f30 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70  >pLeft;.  pIn->p
12f40 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20  Left = 0;.  res 
12f50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  = sqlite3ExprIsC
12f60 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20  onstant(pIn);.  
12f70 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48  pIn->pLeft = pLH
12f80 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  S;.  return res;
12f90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
12fa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12fb0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d  s used by the im
12fc0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
12fd0 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65  the IN (...) ope
12fe0 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58  rator..** The pX
12ff0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
13000 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20  e expression on 
13010 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
13020 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63  N operator, whic
13030 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69  h.** might be ei
13040 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65  ther a list of e
13050 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20  xpressions or a 
13060 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
13070 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
13080 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69  routine is to fi
13090 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
130a0 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61  -tree object tha
130b0 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  t can.** be used
130c0 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20   either to test 
130d0 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69  for membership i
130e0 6e 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72  n the RHS set or
130f0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
13100 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65  ugh.** all membe
13110 72 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65  rs of the RHS se
13120 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c  t, skipping dupl
13130 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  icates..**.** A 
13140 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
13150 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f   on the b-tree o
13160 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68  bject that is th
13170 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
13180 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20  operator.** and 
13190 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65  pX->iTable is se
131a0 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
131b0 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a  f that cursor..*
131c0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
131d0 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  d value of this 
131e0 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74  function indicat
131f0 65 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79  es the b-tree ty
13200 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  pe, as follows:.
13210 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  **.**   IN_INDEX
13220 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68  _ROWID      - Th
13230 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
13240 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
13250 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  e table..**   IN
13260 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
13270 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
13280 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  as opened on an 
13290 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  ascending index.
132a0 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
132b0 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20  NDEX_DESC - The 
132c0 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
132d0 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  d on a descendin
132e0 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
132f0 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20  _INDEX_EPH      
13300 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
13310 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73  as opened on a s
13320 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64  pecially created
13330 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65  populated ephere
13360 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  mal table..**   
13370 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20  IN_INDEX_NOOP   
13380 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20      - No cursor 
13390 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20  was allocated.  
133a0 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  The IN operator 
133b0 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20  must be.**      
133c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133d0 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61     implemented a
133e0 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  s a sequence of 
133f0 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a  comparisons..**.
13400 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62  ** An existing b
13410 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75  -tree might be u
13420 73 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65  sed if the RHS e
13430 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20  xpression pX is 
13440 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71  a simple.** subq
13450 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a  uery such as:.**
13460 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
13470 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d  column1>, <colum
13480 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62  n2>... FROM <tab
13490 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le>.**.** If the
134a0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
134b0 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
134c0 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70  t or a more comp
134d0 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20 74 68  lex subquery, th
134e0 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72  en.** an ephemer
134f0 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e  al table might n
13500 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61  eed to be genera
13510 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53  ted from the RHS
13520 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d   and then.** pX-
13530 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20  >iTable made to 
13540 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68  point to the eph
13550 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73  emeral table ins
13560 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78  tead of an.** ex
13570 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a  isting table..**
13580 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20  .** The inFlags 
13590 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63  parameter must c
135a0 6f 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e  ontain, at a min
135b0 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65  imum, one of the
135c0 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45   bits.** IN_INDE
135d0 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20  X_MEMBERSHIP or 
135e0 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75  IN_INDEX_LOOP bu
135f0 74 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49 66 20  t not both.  If 
13600 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73  inFlags contains
13610 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
13620 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68  BERSHIP, then th
13630 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c  e generated tabl
13640 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  e will be used f
13650 6f 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d  or a fast.** mem
13660 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57  bership test.  W
13670 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58  hen the IN_INDEX
13680 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74  _LOOP bit is set
13690 2c 20 74 68 65 20 49 4e 20 69 6e 64 65 78 20 77  , the IN index w
136a0 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  ill.** be used t
136b0 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  o loop over all 
136c0 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48  values of the RH
136d0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
136e0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ator..**.** When
136f0 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69   IN_INDEX_LOOP i
13700 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
13710 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
13720 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a  sed to iterate.*
13730 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65  * through the se
13740 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20  t members) then 
13750 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20  the b-tree must 
13760 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c  not contain dupl
13770 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70  icates..** An ep
13780 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 77 69  heremal table wi
13790 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 75 6e  ll be created un
137a0 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65  less the selecte
137b0 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75  d columns are gu
137c0 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
137d0 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65  e unique - eithe
137e0 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
137f0 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
13800 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f  RY KEY or due to
13810 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e  .** a UNIQUE con
13820 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78  straint or index
13830 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
13840 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
13850 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
13860 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
13870 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
13880 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
13890 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e  p tests) then an
138a0 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
138b0 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
138c0 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
138d0 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49  s> is a single I
138e0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
138f0 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20  EY column or an 
13900 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65  .** index can be
13910 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20   found with the 
13920 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d  specified <colum
13930 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  ns> as its left-
13940 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  most..**.** If t
13950 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  he IN_INDEX_NOOP
13960 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58  _OK and IN_INDEX
13970 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20  _MEMBERSHIP are 
13980 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20  both set and.** 
13990 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  if the RHS of th
139a0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
139b0 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73   a list (not a s
139c0 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68  ubquery) then th
139d0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69  is.** routine mi
139e0 67 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20  ght decide that 
139f0 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65  creating an ephe
13a00 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72  meral b-tree for
13a10 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74   membership.** t
13a20 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78  esting is too ex
13a30 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75  pensive and retu
13a40 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  rn IN_INDEX_NOOP
13a50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
13a60 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   the.** calling 
13a70 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69  routine should i
13a80 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20  mplement the IN 
13a90 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61  operator using a
13aa0 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20   sequence.** of 
13ab0 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69  Eq or Ne compari
13ac0 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  son operations..
13ad0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62  **.** When the b
13ae0 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75  -tree is being u
13af0 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  sed for membersh
13b00 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61  ip tests, the ca
13b10 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
13b20 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  * might need to 
13b30 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
13b40 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65  not the RHS side
13b50 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
13b60 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  tor.** contains 
13b70 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68  a NULL.  If prRh
13b80 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20  sHasNull is not 
13b90 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61  a NULL pointer a
13ba0 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  nd .** if there 
13bb0 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68  is any chance th
13bc0 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67  at the (...) mig
13bd0 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c  ht contain a NUL
13be0 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75  L value at.** ru
13bf0 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65  ntime, then a re
13c00 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61  gister is alloca
13c10 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69  ted and the regi
13c20 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74  ster number writ
13c30 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73  ten.** to *prRhs
13c40 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72  HasNull. If ther
13c50 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
13c60 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f  hat the (...) co
13c70 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c  ntains a.** NULL
13c80 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72   value, then *pr
13c90 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65  RhsHasNull is le
13ca0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
13cb0 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
13cc0 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
13cd0 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20  nd its location 
13ce0 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73  stored in *prRhs
13cf0 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a  HasNull, then.**
13d00 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
13d10 61 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c  at register will
13d20 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   be NULL if the 
13d30 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20  b-tree contains 
13d40 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e  one or more.** N
13d50 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20  ULL values, and 
13d60 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20  it will be some 
13d70 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
13d80 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
13d90 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c  tains no.** NULL
13da0 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   values..**.** I
13db0 66 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61  f the aiMap para
13dc0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  meter is not NUL
13dd0 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74  L, it must point
13de0 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e   to an array con
13df0 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65  taining.** one e
13e00 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20  lement for each 
13e10 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20  column returned 
13e20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  by the SELECT st
13e30 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52  atement on the R
13e40 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28  HS.** of the IN(
13e50 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54  ...) operator. T
13e60 68 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66  he i'th entry of
13e70 20 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f   the array is po
13e80 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
13e90 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68  .** offset of th
13ea0 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74  e index column t
13eb0 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
13ec0 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75  i'th column retu
13ed0 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53  rned by the.** S
13ee0 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70  ELECT. For examp
13ef0 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  le, if the expre
13f00 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  ssion and select
13f10 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a  ed index are:.**
13f20 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e  .**   (?,?,?) IN
13f30 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63   (SELECT a, b, c
13f40 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43   FROM t1).**   C
13f50 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
13f60 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a  N t1(b, c, a);.*
13f70 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b  *.** then aiMap[
13f80 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  ] is populated w
13f90 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a  ith {2, 0, 1}..*
13fa0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13fb0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
13fc0 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
13fd0 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
13fe0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
13ff0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
14000 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
14010 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20   *pX,           
14020 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
14030 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
14040 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20 20   u32 inFlags,   
14050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14060 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d  N_INDEX_LOOP, _M
14070 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f  EMBERSHIP, and/o
14080 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20  r _NOOP_OK */.  
14090 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  int *prRhsHasNul
140a0 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  l,         /* Re
140b0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e  gister holding N
140c0 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65 65  ULL status.  See
140d0 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   notes */.  int 
140e0 2a 61 69 4d 61 70 2c 20 20 20 20 20 20 20 20 20  *aiMap,         
140f0 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
14100 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69 65  g from Index fie
14110 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c 64  lds to RHS field
14120 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  s */.  int *piTa
14130 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b               
14140 20 20 2f 2a 20 4f 55 54 3a 20 69 6e 64 65 78 20    /* OUT: index 
14150 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 53  to use */.){.  S
14160 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20  elect *p;       
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14180 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74       /* SELECT t
14190 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49  o the right of I
141a0 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
141b0 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20  int eType = 0;  
141c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141d0 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
141e0 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49   RHS table. IN_I
141f0 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20  NDEX_* */.  int 
14200 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
14210 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  Tab++;          
14220 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74    /* Cursor of t
14230 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a  he RHS table */.
14240 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71    int mustBeUniq
14250 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
14260 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
14270 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75  if RHS must be u
14280 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20  nique */.  Vdbe 
14290 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
142a0 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
142b0 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68   /* Virtual mach
142c0 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ine being coded 
142d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58  */..  assert( pX
142e0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
142f0 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20   mustBeUnique = 
14300 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e  (inFlags & IN_IN
14310 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20  DEX_LOOP)!=0;.. 
14320 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f   /* If the RHS o
14330 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f  f this IN(...) o
14340 70 65 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c  perator is a SEL
14350 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d  ECT, and if it m
14360 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65  atters .  ** whe
14370 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
14380 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f  SELECT result co
14390 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
143a0 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65  es, check whethe
143b0 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55  r.  ** or not NU
143c0 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70  LL is actually p
143d0 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20  ossible (it may 
143e0 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d  not be, for exam
143f0 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74  ple, due .  ** t
14400 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  o NOT NULL const
14410 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63  raints in the sc
14420 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c  hema). If no NUL
14430 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73  L values are pos
14440 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20  sible,.  ** set 
14450 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20  prRhsHasNull to 
14460 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  0 before continu
14470 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
14480 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28  rRhsHasNull && (
14490 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pX->flags & EP_x
144a0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
144b0 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72   int i;.    Expr
144c0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
144d0 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  X->x.pSelect->pE
144e0 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
144f0 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
14500 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
14510 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
14520 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d  anBeNull(pEList-
14530 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62  >a[i].pExpr) ) b
14540 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14550 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e  if( i==pEList->n
14560 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72  Expr ){.      pr
14570 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a  RhsHasNull = 0;.
14580 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14590 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
145a0 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
145b0 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62  e or index can b
145c0 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73  e used to.  ** s
145d0 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79  atisfy the query
145e0 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65  .  This is prefe
145f0 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74  rable to generat
14600 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20  ing a new .  ** 
14610 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
14620 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
14630 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70  e->nErr==0 && (p
14640 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f   = isCandidateFo
14650 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29  rInOpt(pX))!=0 )
14660 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
14670 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14690 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
146a0 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
146b0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146d0 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c    /* Table <tabl
146e0 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69  e>. */.    i16 i
146f0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64    /* Database id
14720 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  x for pTab */.  
14730 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
14740 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
14750 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
14760 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
14770 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14780 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
14790 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
147a0 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
147b0 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
147c0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
147d0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
147e0 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
147f0 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
14800 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
14810 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14820 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
14830 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
14840 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
14850 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
14860 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
14870 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
14880 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f      /* Code an O
14890 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  P_Transaction an
148a0 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66  d OP_TableLock f
148b0 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  or <table>. */. 
148c0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
148d0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
148e0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
148f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
14900 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
14910 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
14920 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
14930 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
14940 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
14950 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
14960 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a 20 73  assert(v);  /* s
14970 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
14980 68 61 73 20 61 6c 77 61 79 73 20 62 65 65 6e 20  has always been 
14990 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
149a0 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 78  d */.    if( nEx
149b0 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d  pr==1 && pEList-
149c0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[0].pExpr->iCo
149d0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
149e0 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28 53 45  /* The "x IN (SE
149f0 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
14a00 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a  table)" case */.
14a10 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
14a20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14a30 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
14a40 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
14a50 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73  age(v);..      s
14a60 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
14a70 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
14a80 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
14a90 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79  Read);.      eTy
14aa0 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
14ab0 57 49 44 3b 0a 20 20 20 20 20 20 45 78 70 6c 61  WID;.      Expla
14ac0 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
14ad0 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  rse, 0,.        
14ae0 20 20 20 20 22 55 53 49 4e 47 20 52 4f 57 49 44      "USING ROWID
14af0 20 53 45 41 52 43 48 20 4f 4e 20 54 41 42 4c 45   SEARCH ON TABLE
14b00 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41   %s FOR IN-OPERA
14b10 54 4f 52 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65  TOR",pTab->zName
14b20 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
14b30 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14b40 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
14b50 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
14b60 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
14b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14b80 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
14b90 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ble */.      int
14ba0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31   affinity_ok = 1
14bb0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a  ;.      int i;..
14bc0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
14bd0 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
14be0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
14bf0 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61  ed to perform ea
14c00 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  ch .      ** com
14c10 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
14c20 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
14c30 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75  ity of each colu
14c40 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20 20  mn in table.    
14c50 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53 20    ** on the RHS 
14c60 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
14c70 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c 20  or.  If it not, 
14c80 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
14c90 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75  le to.      ** u
14ca0 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66 20  se any index of 
14cb0 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20 20  the RHS table.  
14cc0 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  */.      for(i=0
14cd0 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66 66  ; i<nExpr && aff
14ce0 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a  inity_ok; i++){.
14cf0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
14d00 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  hs = sqlite3Vect
14d10 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
14d20 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  X->pLeft, i);.  
14d30 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
14d40 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
14d50 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
14d60 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66        char idxaf
14d70 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  f = sqlite3Table
14d80 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
14d90 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48  Tab,iCol); /* RH
14da0 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  S table */.     
14db0 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d     char cmpaff =
14dc0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
14dd0 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64  ffinity(pLhs, id
14de0 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74  xaff);.        t
14df0 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d  estcase( cmpaff=
14e00 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
14e10 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
14e20 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
14e30 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b  LITE_AFF_TEXT );
14e40 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
14e50 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20   cmpaff ){.     
14e60 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
14e70 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  _AFF_BLOB:.     
14e80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14e90 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
14ea0 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
14eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
14ec0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
14ed0 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72  ity() only retur
14ee0 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73  ns TEXT if one s
14ef0 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20  ide or the.     
14f00 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
14f10 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20  has no affinity 
14f20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73 69  and the other si
14f30 64 65 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e  de is TEXT.  Hen
14f40 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ce,.            
14f50 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  ** the only way 
14f60 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65  for cmpaff to be
14f70 20 54 45 58 54 20 69 73 20 66 6f 72 20 69 64 78   TEXT is for idx
14f80 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20  aff to be TEXT. 
14f90 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e             ** an
14fa0 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f  d for the term o
14fb0 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
14fc0 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61   IN to have no a
14fd0 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
14fe0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14ff0 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  idxaff==SQLITE_A
15000 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20  FF_TEXT );.     
15010 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15020 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
15030 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66  .            aff
15040 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74  inity_ok = sqlit
15050 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
15060 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20  ity(idxaff);.   
15070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
15080 20 20 20 20 20 20 69 66 28 20 61 66 66 69 6e 69        if( affini
15090 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20  ty_ok ){.       
150a0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
150b0 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78  n existing index
150c0 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20   that will work 
150d0 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72  for this IN oper
150e0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
150f0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
15100 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
15110 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49  Type==0; pIdx=pI
15120 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
15130 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f        Bitmask co
15140 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 43  lUsed;      /* C
15150 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
15160 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  dex used */.    
15170 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 43        Bitmask mC
15180 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ol;         /* M
15190 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75 72 72  ask for the curr
151a0 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ent column */.  
151b0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
151c0 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20  ->nColumn<nExpr 
151d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
151e0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
151f0 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
15200 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
15210 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
15220 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53  m nColumn is BMS
15230 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73  -2, not BMS-1, s
15240 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 6f  o that we can co
15250 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20 20 20  mpute.          
15260 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70 72  ** BITMASK(nExpr
15270 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66 6c  ) without overfl
15280 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  owing */.       
15290 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64     testcase( pId
152a0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d  x->nColumn==BMS-
152b0 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  2 );.          t
152c0 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e  estcase( pIdx->n
152d0 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b  Column==BMS-1 );
152e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
152f0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d  Idx->nColumn>=BM
15300 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  S-1 ) continue;.
15310 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 75            if( mu
15320 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20 20  stBeUnique ){.  
15330 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
15340 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70  dx->nKeyCol>nExp
15350 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  r.             |
15360 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  |(pIdx->nColumn>
15370 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e 69 71  nExpr && !IsUniq
15380 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a 20  ueIndex(pIdx)). 
15390 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
153a0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
153b0 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 69  inue;  /* This i
153c0 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69 71  ndex is not uniq
153d0 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20 52  ue over the IN R
153e0 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  HS columns */.  
153f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15400 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
15410 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20 30       colUsed = 0
15420 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f  ;   /* Columns o
15430 66 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f 20  f index used so 
15440 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  far */.         
15450 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
15460 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
15470 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
15480 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
15490 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
154a0 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
154b0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 68         Expr *pRh
154c0 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s = pEList->a[i]
154d0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
154e0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65      CollSeq *pRe
154f0 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  q = sqlite3Binar
15500 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
15510 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52  pParse, pLhs, pR
15520 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  hs);.           
15530 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20   int j;.  .     
15540 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15550 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e  Req!=0 || pRhs->
15560 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49  iColumn==XN_ROWI
15570 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  D || pParse->nEr
15580 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
15590 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70   for(j=0; j<nExp
155a0 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
155b0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
155c0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52  >aiColumn[j]!=pR
155d0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  hs->iColumn ) co
155e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
155f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
15600 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b  dx->azColl[j] );
15610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
15620 66 28 20 70 52 65 71 21 3d 30 20 26 26 20 73 71  f( pReq!=0 && sq
15630 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65  lite3StrICmp(pRe
15640 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e  q->zName, pIdx->
15650 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b  azColl[j])!=0 ){
15660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15670 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
15680 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15690 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
156a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
156b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
156c0 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a  =nExpr ) break;.
156d0 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c              mCol
156e0 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20   = MASKBIT(j);. 
156f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d             if( m
15700 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29 20  Col & colUsed ) 
15710 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63  break; /* Each c
15720 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20  olumn used only 
15730 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  once */.        
15740 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d      colUsed |= m
15750 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
15760 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d   if( aiMap ) aiM
15770 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20  ap[i] = j;.     
15780 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
15790 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
157a0 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21  Expr || colUsed!
157b0 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29  =(MASKBIT(nExpr)
157c0 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  -1) );.         
157d0 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d   if( colUsed==(M
157e0 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
157f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15800 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
15810 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
15820 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78 20  means the index 
15830 70 49 64 78 20 69 73 20 75 73 61 62 6c 65 20 2a  pIdx is usable *
15840 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
15850 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
15860 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
15870 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
15880 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
15890 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
158a0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
158b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 22 55 53 49 4e 47 20 49 4e 44 45 58 20 25 73   "USING INDEX %s
158e0 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52   FOR IN-OPERATOR
158f0 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  ",pIdx->zName));
15900 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
15910 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15920 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
15930 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
15940 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20   iDb);.         
15950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
15960 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
15970 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
15980 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
15990 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
159a0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
159b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49         assert( I
159c0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
159d0 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  SC == IN_INDEX_I
159e0 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20  NDEX_ASC+1 );.  
159f0 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
15a00 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
15a10 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f  _ASC + pIdx->aSo
15a20 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20  rtOrder[0];.  . 
15a30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
15a40 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23  rRhsHasNull ){.#
15a50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15a60 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
15a70 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 20 20 20  MASK.           
15a80 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20 28 31     i64 mask = (1
15a90 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20 20 20  <<nExpr)-1;.    
15aa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15ab0 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
15ac0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  v, OP_ColumnsUse
15ad0 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
15ae0 20 20 20 20 20 20 69 54 61 62 2c 20 30 2c 20 30        iTab, 0, 0
15af0 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34  , (u8*)&mask, P4
15b00 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a  _INT64);.#endif.
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
15b20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b  rRhsHasNull = ++
15b30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15b40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15b50 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
15b60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15b70 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
15b80 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68  g(v, iTab, *prRh
15b90 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
15ba0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15bc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15bd0 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
15be0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
15bf0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64          } /* End
15c00 20 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65 78   loop over index
15c10 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a  es */.      } /*
15c20 20 45 6e 64 20 69 66 28 20 61 66 66 69 6e 69 74   End if( affinit
15c30 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20  y_ok ) */.    } 
15c40 2f 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e  /* End if not an
15c50 20 72 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a   rowid index */.
15c60 20 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d    } /* End attem
15c70 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75  pt to optimize u
15c80 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f  sing an index */
15c90 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65  ..  /* If no pre
15ca0 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69  existing index i
15cb0 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  s available for 
15cc0 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20  the IN clause.  
15cd0 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  ** and IN_INDEX_
15ce0 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77  NOOP is an allow
15cf0 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e  ed reply.  ** an
15d00 64 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  d the RHS of the
15d10 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
15d20 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75  a list, not a su
15d30 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20  bquery.  ** and 
15d40 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63  the RHS is not c
15d50 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61 73 20 74  onstant or has t
15d60 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d  wo or fewer term
15d70 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20  s,.  ** then it 
15d80 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65  is not worth cre
15d90 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ating an ephemer
15da0 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c  al table to eval
15db0 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e  uate.  ** the IN
15dc0 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74   operator so ret
15dd0 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  urn IN_INDEX_NOO
15de0 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  P..  */.  if( eT
15df0 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e  ype==0.   && (in
15e00 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
15e10 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20  _NOOP_OK).   && 
15e20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15e30 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
15e40 74 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74  t).   && (!sqlit
15e50 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e  e3InRhsIsConstan
15e60 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70  t(pX) || pX->x.p
15e70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a  List->nExpr<=2).
15e80 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d    ){.    eType =
15e90 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a   IN_INDEX_NOOP;.
15ea0 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
15eb0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  ==0 ){.    /* Co
15ec0 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20  uld not find an 
15ed0 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
15ee0 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61  r index to use a
15ef0 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65  s the RHS b-tree
15f00 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c  ..    ** We will
15f10 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74   have to generat
15f20 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
15f30 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a  able to do the j
15f40 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ob..    */.    u
15f50 33 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  32 savedNQueryLo
15f60 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
15f70 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  eryLoop;.    int
15f80 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
15f90 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  0;.    eType = I
15fa0 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20  N_INDEX_EPH;.   
15fb0 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49   if( inFlags & I
15fc0 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a  N_INDEX_LOOP ){.
15fd0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51        pParse->nQ
15fe0 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20  ueryLoop = 0;.  
15ff0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68    }else if( prRh
16000 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  sHasNull ){.    
16010 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
16020 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  = rMayHaveNull =
16030 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
16040 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
16050 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
16060 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
16070 6f 64 65 52 68 73 4f 66 49 4e 28 70 50 61 72 73  odeRhsOfIN(pPars
16080 65 2c 20 70 58 2c 20 69 54 61 62 29 3b 0a 20 20  e, pX, iTab);.  
16090 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75    if( rMayHaveNu
160a0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
160b0 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
160c0 67 28 76 2c 20 69 54 61 62 2c 20 72 4d 61 79 48  g(v, iTab, rMayH
160d0 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  aveNull);.    }.
160e0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
160f0 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51  ryLoop = savedNQ
16100 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 0a 0a 20  ueryLoop;.  }.. 
16110 20 69 66 28 20 61 69 4d 61 70 20 26 26 20 65 54   if( aiMap && eT
16120 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype!=IN_INDEX_IN
16130 44 45 58 5f 41 53 43 20 26 26 20 65 54 79 70 65  DEX_ASC && eType
16140 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  !=IN_INDEX_INDEX
16150 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74  _DESC ){.    int
16160 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73   i, n;.    n = s
16170 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
16180 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b  Size(pX->pLeft);
16190 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
161a0 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d  n; i++) aiMap[i]
161b0 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 2a 70 69 54   = i;.  }.  *piT
161c0 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 72 65 74  ab = iTab;.  ret
161d0 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e  urn eType;.}.#en
161e0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
161f0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16200 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  Y./*.** Argument
16210 20 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c   pExpr is an (?,
16220 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65   ?...) IN(...) e
16230 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20  xpression. This 
16240 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
16250 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
16260 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  ns a nul-termina
16270 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
16280 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66  ining .** the af
16290 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75  finities to be u
162a0 73 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  sed for each col
162b0 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  umn of the compa
162c0 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  rison..**.** It 
162d0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
162e0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
162f0 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ler to ensure th
16300 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  at the returned.
16310 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76 65  ** string is eve
16320 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
16330 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
16340 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  e()..*/.static c
16350 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e  har *exprINAffin
16360 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
16370 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
16380 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d  .  Expr *pLeft =
16390 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
163a0 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
163b0 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
163c0 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65  e(pLeft);.  Sele
163d0 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70  ct *pSelect = (p
163e0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
163f0 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45  _xIsSelect) ? pE
16400 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a  xpr->x.pSelect :
16410 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74   0;.  char *zRet
16420 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ;..  assert( pEx
16430 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
16440 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65  .  zRet = sqlite
16450 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61  3DbMallocRaw(pPa
16460 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29  rse->db, nVal+1)
16470 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a  ;.  if( zRet ){.
16480 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
16490 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20  or(i=0; i<nVal; 
164a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
164b0 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65   *pA = sqlite3Ve
164c0 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
164d0 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  (pLeft, i);.    
164e0 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74    char a = sqlit
164f0 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
16500 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  A);.      if( pS
16510 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
16520 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74   zRet[i] = sqlit
16530 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
16540 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  y(pSelect->pELis
16550 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61  t->a[i].pExpr, a
16560 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16570 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
16580 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
16590 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c   }.    zRet[nVal
165a0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
165b0 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
165c0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
165d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
165e0 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  ERY./*.** Load t
165f0 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
16600 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
16610 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rst argument wit
16620 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d  h an error .** m
16630 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f  essage of the fo
16640 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62  rm:.**.**   "sub
16650 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
16660 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65  N columns - expe
16670 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f  cted M".*/   .vo
16680 69 64 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c  id sqlite3Subsel
16690 65 63 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a  ectError(Parse *
166a0 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74  pParse, int nAct
166b0 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74  ual, int nExpect
166c0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
166d0 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c  *zFmt = "sub-sel
166e0 65 63 74 20 72 65 74 75 72 6e 73 20 25 64 20 63  ect returns %d c
166f0 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
16700 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33  d %d";.  sqlite3
16710 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16720 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20   zFmt, nActual, 
16730 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64  nExpect);.}.#end
16740 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73  if../*.** Expres
16750 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20  sion pExpr is a 
16760 76 65 63 74 6f 72 20 74 68 61 74 20 68 61 73 20  vector that has 
16770 62 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20 63  been used in a c
16780 6f 6e 74 65 78 74 20 77 68 65 72 65 0a 2a 2a 20  ontext where.** 
16790 69 74 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  it is not permit
167a0 74 65 64 2e 20 49 66 20 70 45 78 70 72 20 69 73  ted. If pExpr is
167b0 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 76 65   a sub-select ve
167c0 63 74 6f 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ctor, this routi
167d0 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65  ne .** loads the
167e0 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 77 69   Parse object wi
167f0 74 68 20 61 20 6d 65 73 73 61 67 65 20 6f 66 20  th a message of 
16800 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
16810 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65    "sub-select re
16820 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20  turns N columns 
16830 2d 20 65 78 70 65 63 74 65 64 20 31 22 0a 2a 2a  - expected 1".**
16840 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 74 20 69 73  .** Or, if it is
16850 20 61 20 72 65 67 75 6c 61 72 20 73 63 61 6c 61   a regular scala
16860 72 20 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20  r vector:.**.** 
16870 20 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73    "row value mis
16880 75 73 65 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64  used".*/   .void
16890 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72   sqlite3VectorEr
168a0 72 6f 72 4d 73 67 28 50 61 72 73 65 20 2a 70 50  rorMsg(Parse *pP
168b0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
168c0 72 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r){.#ifndef SQLI
168d0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
168e0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
168f0 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
16900 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
16910 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
16920 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78  pParse, pExpr->x
16930 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
16940 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 7d  ->nExpr, 1);.  }
16950 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
16960 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16970 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
16980 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
16990 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
169a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
169b0 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
169c0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
169d0 69 6c 6c 20 63 6f 6e 73 74 72 75 63 74 20 61 6e  ill construct an
169e0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
169f0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20   containing all 
16a00 74 65 72 6d 73 0a 2a 2a 20 69 6e 20 74 68 65 20  terms.** in the 
16a10 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
16a20 72 61 74 6f 72 2e 20 20 54 68 65 20 49 4e 20 6f  rator.  The IN o
16a30 70 65 72 61 74 6f 72 20 63 61 6e 20 62 65 20 69  perator can be i
16a40 6e 20 65 69 74 68 65 72 20 6f 66 20 74 77 6f 0a  n either of two.
16a50 2a 2a 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20  ** forms:.**.** 
16a60 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31      x IN (4,5,11
16a70 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  )              -
16a80 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
16a90 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74  th list on right
16aa0 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20  -hand side.**   
16ab0 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61    x IN (SELECT a
16ac0 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20   FROM b)     -- 
16ad0 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
16ae0 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
16af0 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65   right.**.** The
16b00 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
16b10 20 69 73 20 74 68 65 20 49 4e 20 6f 70 65 72 61   is the IN opera
16b20 74 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72  tor.  The cursor
16b30 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a   number for the.
16b40 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20 65  ** constructed e
16b50 70 68 65 72 6d 65 72 61 6c 20 74 61 62 6c 65 20  phermeral table 
16b60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68  is returned.  Th
16b70 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
16b80 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 74 61   ephemeral.** ta
16b90 62 6c 65 20 69 73 20 63 6f 6d 70 75 74 65 64 2c  ble is computed,
16ba0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
16bb0 65 72 20 69 73 20 61 6c 73 6f 20 73 74 6f 72 65  er is also store
16bc0 64 20 69 6e 20 70 45 78 70 72 2d 3e 69 54 61 62  d in pExpr->iTab
16bd0 6c 65 2c 0a 2a 2a 20 68 6f 77 65 76 65 72 20 74  le,.** however t
16be0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
16bf0 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20   returned might 
16c00 6e 6f 74 20 62 65 20 74 68 65 20 73 61 6d 65 2c  not be the same,
16c10 20 61 73 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20   as it might.** 
16c20 68 61 76 65 20 62 65 65 6e 20 64 75 70 6c 69 63  have been duplic
16c30 61 74 65 64 20 75 73 69 6e 67 20 4f 50 5f 4f 70  ated using OP_Op
16c40 65 6e 44 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  enDup..**.** If 
16c50 74 68 65 20 4c 48 53 20 65 78 70 72 65 73 73 69  the LHS expressi
16c60 6f 6e 20 28 22 78 22 20 69 6e 20 74 68 65 20 65  on ("x" in the e
16c70 78 61 6d 70 6c 65 73 29 20 69 73 20 61 20 63 6f  xamples) is a co
16c80 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 0a 2a  lumn value, or.*
16c90 2a 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  * the SELECT sta
16ca0 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
16cb0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
16cc0 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
16cd0 20 6f 66 20 74 68 61 74 0a 2a 2a 20 63 6f 6c 75   of that.** colu
16ce0 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
16cf0 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
16d00 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
16d10 61 6e 64 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43  and the.** SELEC
16d20 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
16d30 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
16d40 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
16d50 79 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 66 20  y is used.** if 
16d60 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
16d70 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
16d80 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
16d90 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 27 78 27  f neither.** 'x'
16da0 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e   nor the SELECT.
16db0 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
16dc0 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
16dd0 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a  umeric affinity.
16de0 2a 2a 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76  ** is used..*/.v
16df0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 52  oid sqlite3CodeR
16e00 68 73 4f 66 49 4e 28 0a 20 20 50 61 72 73 65 20  hsOfIN(.  Parse 
16e10 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16e20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
16e30 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
16e40 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
16e50 20 20 2f 2a 20 54 68 65 20 49 4e 20 6f 70 65 72    /* The IN oper
16e60 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ator */.  int iT
16e70 61 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ab              
16e80 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 63 75    /* Use this cu
16e90 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  rsor number */.)
16ea0 7b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65  {.  int addrOnce
16eb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16ec0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
16ed0 65 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75  e OP_Once instru
16ee0 63 74 69 6f 6e 20 61 74 20 74 6f 70 20 2a 2f 0a  ction at top */.
16ef0 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
16f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16f10 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
16f20 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
16f30 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  truction */.  Ex
16f40 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
16f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
16f60 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
16f70 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 4b 65 79  perator */.  Key
16f80 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
16f90 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20   0;      /* Key 
16fa0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
16fb0 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20   int nVal;      
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16fd0 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70  Size of vector p
16fe0 4c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  Left */.  Vdbe *
16ff0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
17000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
17010 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
17020 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
17030 6f 6e 20 2a 2f 0a 0a 20 20 76 20 3d 20 70 50 61  on */..  v = pPa
17040 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
17050 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20  sert( v!=0 );.. 
17060 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69   /* The evaluati
17070 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 6d 75 73  on of the IN mus
17080 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76  t be repeated ev
17090 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a  ery time it.  **
170a0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
170b0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
170c0 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
170d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
170e0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
170f0 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
17100 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
17110 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
17120 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
17130 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
17140 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
17150 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
17160 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
17170 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
17180 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
17190 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
171a0 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
171b0 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 20  compute the RHS 
171c0 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 61  just once.  ** a
171d0 6e 64 20 72 65 75 73 65 20 69 74 20 6d 61 6e 79  nd reuse it many
171e0 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 69   names..  */.  i
171f0 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
17200 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
17210 72 53 65 6c 65 63 74 29 20 26 26 20 70 50 61 72  rSelect) && pPar
17220 73 65 2d 3e 69 53 65 6c 66 54 61 62 3d 3d 30 20  se->iSelfTab==0 
17230 29 7b 0a 20 20 20 20 2f 2a 20 52 65 75 73 65 20  ){.    /* Reuse 
17240 6f 66 20 74 68 65 20 52 48 53 20 69 73 20 61 6c  of the RHS is al
17250 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 2f 2a 20  lowed */.    /* 
17260 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
17270 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
17280 20 63 6f 64 65 64 2c 20 62 75 74 20 74 68 65 20   coded, but the 
17290 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20  previous code.  
172a0 20 20 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 68    ** might not h
172b0 61 76 65 20 62 65 65 6e 20 69 6e 76 6f 6b 65 64  ave been invoked
172c0 20 79 65 74 2c 20 73 6f 20 69 6e 76 6f 6b 65 20   yet, so invoke 
172d0 69 74 20 6e 6f 77 20 61 73 20 61 20 73 75 62 72  it now as a subr
172e0 6f 75 74 69 6e 65 2e 20 0a 20 20 20 20 2a 2f 0a  outine. .    */.
172f0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
17300 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
17310 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20 20 20  P_Subrtn) ){.   
17320 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
17330 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
17340 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
17350 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17360 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
17370 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
17380 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
17390 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51          ExplainQ
173a0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
173b0 2c 20 30 2c 20 22 52 45 55 53 45 20 4c 49 53 54  , 0, "REUSE LIST
173c0 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20   SUBQUERY %d",. 
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
173e0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73  pr->x.pSelect->s
173f0 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 7d 0a  elId));.      }.
17400 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17410 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
17420 73 75 62 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75  sub, pExpr->y.su
17430 62 2e 72 65 67 52 65 74 75 72 6e 2c 0a 20 20 20  b.regReturn,.   
17440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17450 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75       pExpr->y.su
17460 62 2e 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  b.iAddr);.      
17470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17480 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
17490 20 69 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 54   iTab, pExpr->iT
174a0 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  able);.      sql
174b0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
174c0 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20  (v, addrOnce);. 
174d0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
174e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e   }..    /* Begin
174f0 20 63 6f 64 69 6e 67 20 74 68 65 20 73 75 62 72   coding the subr
17500 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78  outine */.    Ex
17510 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
17520 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b  xpr, EP_Subrtn);
17530 0a 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75  .    pExpr->y.su
17540 62 2e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  b.regReturn = ++
17550 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
17560 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69    pExpr->y.sub.i
17570 41 64 64 72 20 3d 0a 20 20 20 20 20 20 73 71 6c  Addr =.      sql
17580 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17590 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
175a0 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65   pExpr->y.sub.re
175b0 67 52 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20  gReturn) + 1;.  
175c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
175d0 2c 20 22 72 65 74 75 72 6e 20 61 64 64 72 65 73  , "return addres
175e0 73 22 29 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f  s"));..    addrO
175f0 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nce = sqlite3Vdb
17600 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
17610 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
17620 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(v);.  }..  /* 
17630 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
17640 74 68 69 73 20 69 73 20 61 20 76 65 63 74 6f 72  this is a vector
17650 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
17660 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
17670 3e 70 4c 65 66 74 3b 0a 20 20 6e 56 61 6c 20 3d  >pLeft;.  nVal =
17680 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
17690 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 0a  orSize(pLeft);..
176a0 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
176b0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
176c0 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e  le that will con
176d0 74 61 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  tain the content
176e0 20 6f 66 0a 20 20 2a 2a 20 52 48 53 20 6f 66 20   of.  ** RHS of 
176f0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  the IN operator.
17700 0a 20 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e 69  .  */.  pExpr->i
17710 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
17720 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
17730 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
17740 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45  penEphemeral, pE
17750 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 56 61  xpr->iTable, nVa
17760 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l);.#ifdef SQLIT
17770 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
17780 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 69 66 28 20  _COMMENTS.  if( 
17790 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
177a0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
177b0 65 63 74 29 20 29 7b 0a 20 20 20 20 56 64 62 65  ect) ){.    Vdbe
177c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 52 65 73  Comment((v, "Res
177d0 75 6c 74 20 6f 66 20 53 45 4c 45 43 54 20 25 75  ult of SELECT %u
177e0 22 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  ", pExpr->x.pSel
177f0 65 63 74 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20  ect->selId));.  
17800 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 43  }else{.    VdbeC
17810 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 52 48 53 20  omment((v, "RHS 
17820 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 22 29  of IN operator")
17830 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
17840 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
17850 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
17860 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c  Parse->db, nVal,
17870 20 31 29 3b 0a 0a 20 20 69 66 28 20 45 78 70 72   1);..  if( Expr
17880 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
17890 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
178a0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
178b0 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  1:     expr IN (
178c0 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20  SELECT ...).    
178d0 2a 2a 0a 20 20 20 20 2a 2a 20 47 65 6e 65 72 61  **.    ** Genera
178e0 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
178f0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
17900 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
17910 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
17920 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
17930 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
17940 61 62 6f 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  above..    */.  
17950 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
17960 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  t = pExpr->x.pSe
17970 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 4c 69  lect;.    ExprLi
17980 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65  st *pEList = pSe
17990 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20  lect->pEList;.. 
179a0 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
179b0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
179c0 22 25 73 4c 49 53 54 20 53 55 42 51 55 45 52 59  "%sLIST SUBQUERY
179d0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 61 64   %d",.        ad
179e0 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45  drOnce?"":"CORRE
179f0 4c 41 54 45 44 20 22 2c 20 70 53 65 6c 65 63 74  LATED ", pSelect
17a00 2d 3e 73 65 6c 49 64 0a 20 20 20 20 29 29 3b 0a  ->selId.    ));.
17a10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48      /* If the LH
17a20 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68 65  S and RHS of the
17a30 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f 20   IN operator do 
17a40 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74 0a  not match, that.
17a50 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c      ** error wil
17a60 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61 75 67  l have been caug
17a70 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77  ht long before w
17a80 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
17a90 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 41  nt. */.    if( A
17aa0 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45  LWAYS(pEList->nE
17ab0 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20  xpr==nVal) ){.  
17ac0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
17ad0 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  est;.      int i
17ae0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
17af0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
17b00 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 54  est, SRT_Set, iT
17b10 61 62 29 3b 0a 20 20 20 20 20 20 64 65 73 74 2e  ab);.      dest.
17b20 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70 72 49  zAffSdst = exprI
17b30 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  NAffinity(pParse
17b40 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
17b50 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
17b60 3d 20 30 3b 0a 20 20 20 20 20 20 74 65 73 74 63  = 0;.      testc
17b70 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65  ase( pSelect->se
17b80 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
17b90 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
17ba0 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f  stcase( pKeyInfo
17bb0 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64  ==0 ); /* Caused
17bc0 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74   by OOM in sqlit
17bd0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29  e3KeyInfoAlloc()
17be0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
17bf0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
17c00 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
17c10 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  st) ){.        s
17c20 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
17c30 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
17c40 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
17c50 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
17c60 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
17c70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
17c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
17c90 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
17ca0 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66  se->db, dest.zAf
17cb0 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 61 73  fSdst);.      as
17cc0 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d  sert( pKeyInfo!=
17cd0 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c  0 ); /* OOM will
17ce0 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74 65   cause exit afte
17cf0 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  r sqlite3Select(
17d00 29 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  ) */.      asser
17d10 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
17d20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
17d30 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
17d40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
17d50 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
17d60 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
17d70 6f 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  o) );.      for(
17d80 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  i=0; i<nVal; i++
17d90 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
17da0 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  *p = sqlite3Vect
17db0 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
17dc0 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
17dd0 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
17de0 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[i] = sqlite3Bi
17df0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
17e00 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq(.            
17e10 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
17e20 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20  t->a[i].pExpr.  
17e30 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
17e40 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
17e50 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
17e60 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a  >x.pList!=0) ){.
17e70 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
17e80 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
17e90 6c 69 73 74 29 0a 20 20 20 20 2a 2a 0a 20 20 20  list).    **.   
17ea0 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   ** For each exp
17eb0 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
17ec0 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
17ed0 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
17ee0 61 6e 64 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  and.    ** store
17ef0 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
17f00 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
17f10 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
17f20 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
17f30 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
17f40 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
17f50 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
17f60 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
17f70 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 20 63 6f 6c  not.    ** a col
17f80 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
17f90 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a   affinity..    *
17fa0 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66 69 6e  /.    char affin
17fb0 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ity;            
17fc0 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  /* Affinity of t
17fd0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
17fe0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   */.    int i;. 
17ff0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
18000 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
18010 69 73 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ist;.    struct 
18020 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
18030 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 31  Item;.    int r1
18040 2c 20 72 32 3b 0a 20 20 20 20 61 66 66 69 6e 69  , r2;.    affini
18050 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
18060 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
18070 0a 20 20 20 20 69 66 28 20 61 66 66 69 6e 69 74  .    if( affinit
18080 79 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  y<=SQLITE_AFF_NO
18090 4e 45 20 29 7b 0a 20 20 20 20 20 20 61 66 66 69  NE ){.      affi
180a0 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
180b0 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20  F_BLOB;.    }.  
180c0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
180d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
180e0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
180f0 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
18100 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 70 4b 65  fo) );.      pKe
18110 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20  yInfo->aColl[0] 
18120 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
18130 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
18140 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
18150 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  }..    /* Loop t
18160 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
18170 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
18180 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 72 31 20  ist>. */.    r1 
18190 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
181a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
181b0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
181c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
181d0 0a 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74  .    for(i=pList
181e0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
181f0 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
18200 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
18210 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
18220 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20  Item->pExpr;..  
18230 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78      /* If the ex
18240 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
18250 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65  constant then we
18260 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20   will need to.  
18270 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
18280 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73  he test that was
18290 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65   generated above
182a0 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
182b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
182c0 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65  ode only execute
182d0 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65  s once.  Because
182e0 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74   for a non-const
182f0 61 6e 74 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  ant.      ** exp
18300 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
18310 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
18320 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
18330 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
18340 20 61 64 64 72 4f 6e 63 65 20 26 26 20 21 73 71   addrOnce && !sq
18350 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
18360 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
18370 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18380 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
18390 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20  ddrOnce);.      
183a0 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65    ExprClearPrope
183b0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75  rty(pExpr, EP_Su
183c0 62 72 74 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  brtn);.        a
183d0 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20  ddrOnce = 0;.   
183e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
183f0 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
18400 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
18410 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
18420 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
18430 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
18440 65 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72  e(pParse, pE2, r
18450 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
18460 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18470 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 31  P_MakeRecord, r1
18480 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
18490 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ty, 1);.      sq
184a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
184b0 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
184c0 72 74 2c 20 69 54 61 62 2c 20 72 32 2c 20 72 31  rt, iTab, r2, r1
184d0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
184e0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
184f0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
18500 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
18510 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18520 72 73 65 2c 20 72 32 29 3b 0a 20 20 7d 0a 20 20  rse, r2);.  }.  
18530 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
18540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18550 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
18560 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66   (void *)pKeyInf
18570 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
18580 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72 4f 6e    }.  if( addrOn
18590 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ce ){.    sqlite
185a0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
185b0 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
185c0 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65  /* Subroutine re
185d0 74 75 72 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  turn */.    sqli
185e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
185f0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 45 78 70   OP_Return, pExp
18600 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75  r->y.sub.regRetu
18610 72 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rn);.    sqlite3
18620 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
18630 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64  pExpr->y.sub.iAd
18640 64 72 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  dr-1, sqlite3Vdb
18650 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
18660 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  1);.    sqlite3C
18670 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
18680 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 7d 0a  (pParse);.  }.}.
18690 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
186a0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
186b0 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  /../*.** Generat
186c0 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
186d0 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
186e0 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
186f0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6f 72  expression.** or
18700 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
18710 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
18720 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
18730 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
18740 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
18750 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
18760 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
18770 75 62 71 75 65 72 79 0a 2a 2a 0a 2a 2a 20 54 68  ubquery.**.** Th
18780 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
18790 72 20 69 73 20 74 68 65 20 53 45 4c 45 43 54 20  r is the SELECT 
187a0 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
187b0 6f 72 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  or to be coded..
187c0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
187d0 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
187e0 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 2e  olds the result.
187f0 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f    For a multi-co
18800 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 0a 2a 2a  lumn SELECT, .**
18810 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
18820 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69  tored in a conti
18830 67 75 6f 75 73 20 61 72 72 61 79 20 6f 66 20 72  guous array of r
18840 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
18850 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
18860 20 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72   is the register
18870 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   of the left-mos
18880 74 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e  t result column.
18890 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
188a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
188b0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
188c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
188d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
188e0 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20  Subselect(Parse 
188f0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
18900 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 61 64 64  Expr){.  int add
18910 72 4f 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20  rOnce = 0;      
18920 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18930 6f 66 20 4f 50 5f 4f 6e 63 65 20 61 74 20 74 6f  of OP_Once at to
18940 70 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  p of subroutine 
18950 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
18960 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
18970 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
18980 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
18990 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
189a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
189b0 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
189c0 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
189d0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
189e0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
189f0 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69  * How to deal wi
18a00 74 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  th SELECT result
18a10 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20   */.  int nReg; 
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a30 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74    /* Registers t
18a40 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
18a50 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20  Expr *pLimit;   
18a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18a70 65 77 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73  ew limit express
18a80 69 6f 6e 20 2a 2f 0a 0a 20 20 56 64 62 65 20 2a  ion */..  Vdbe *
18a90 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
18aa0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
18ab0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
18ac0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
18ad0 58 49 53 54 53 20 29 3b 0a 20 20 74 65 73 74 63  XISTS );.  testc
18ae0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
18af0 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 61  TK_SELECT );.  a
18b00 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
18b10 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70  ==TK_EXISTS || p
18b20 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
18b30 45 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ECT );.  assert(
18b40 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
18b50 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
18b60 6c 65 63 74 29 20 29 3b 0a 20 20 70 53 65 6c 20  lect) );.  pSel 
18b70 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
18b80 63 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76  ct;..  /* The ev
18b90 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  aluation of the 
18ba0 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75  EXISTS/SELECT mu
18bb0 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65  st be repeated e
18bc0 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a  very time it.  *
18bd0 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
18be0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
18bf0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
18c00 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
18c10 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
18c20 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
18c30 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
18c40 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
18c50 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
18c60 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
18c70 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
18c80 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
18c90 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
18ca0 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
18cb0 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
18cc0 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
18cd0 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
18ce0 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
18cf0 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
18d00 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
18d10 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
18d20 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
18d30 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
18d40 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
18d50 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
18d60 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
18d70 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  lect) ){.    /* 
18d80 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
18d90 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
18da0 20 63 6f 64 65 64 2c 20 74 68 65 6e 20 69 6e 76   coded, then inv
18db0 6f 6b 65 20 69 74 20 61 73 20 61 0a 20 20 20 20  oke it as a.    
18dc0 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 2a  ** subroutine. *
18dd0 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  /.    if( ExprHa
18de0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
18df0 20 45 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20   EP_Subrtn) ){. 
18e00 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
18e10 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
18e20 2c 20 22 52 45 55 53 45 20 53 55 42 51 55 45 52  , "REUSE SUBQUER
18e30 59 20 25 64 22 2c 20 70 53 65 6c 2d 3e 73 65 6c  Y %d", pSel->sel
18e40 49 64 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Id));.      sqli
18e50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18e60 20 4f 50 5f 47 6f 73 75 62 2c 20 70 45 78 70 72   OP_Gosub, pExpr
18e70 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72  ->y.sub.regRetur
18e80 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
18e90 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
18ea0 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 29 3b 0a  ->y.sub.iAddr);.
18eb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
18ec0 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
18ed0 7d 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  }..    /* Begin 
18ee0 63 6f 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  coding the subro
18ef0 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70  utine */.    Exp
18f00 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
18f10 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a  pr, EP_Subrtn);.
18f20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62      pExpr->y.sub
18f30 2e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  .regReturn = ++p
18f40 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
18f50 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41   pExpr->y.sub.iA
18f60 64 64 72 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  ddr =.      sqli
18f70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18f80 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
18f90 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67  pExpr->y.sub.reg
18fa0 52 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20  Return) + 1;.   
18fb0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18fc0 20 22 72 65 74 75 72 6e 20 61 64 64 72 65 73 73   "return address
18fd0 22 29 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e  "));..    addrOn
18fe0 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
18ff0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
19000 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
19010 28 76 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  (v);.  }.  .  /*
19020 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67   For a SELECT, g
19030 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
19040 70 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66  put the values f
19050 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  or all columns o
19060 66 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  f.  ** the first
19070 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72   row into an arr
19080 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
19090 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 69  and return the i
190a0 6e 64 65 78 20 6f 66 0a 20 20 2a 2a 20 74 68 65  ndex of.  ** the
190b0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 2e   first register.
190c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
190d0 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c  is is an EXISTS,
190e0 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65   write an intege
190f0 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29  r 0 (not exists)
19100 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a 20   or 1 (exists). 
19110 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73   ** into a regis
19120 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ter and return t
19130 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d  hat register num
19140 62 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ber..  **.  ** I
19150 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68  n both cases, th
19160 65 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65  e query is augme
19170 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54  nted with "LIMIT
19180 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 2a 2a 20   1".  Any .  ** 
19190 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69  preexisting limi
191a0 74 20 69 73 20 64 69 73 63 61 72 64 65 64 20 69  t is discarded i
191b0 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e  n place of the n
191c0 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 2a 2f  ew LIMIT 1..  */
191d0 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
191e0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
191f0 22 25 73 53 43 41 4c 41 52 20 53 55 42 51 55 45  "%sSCALAR SUBQUE
19200 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  RY %d",.        
19210 61 64 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52  addrOnce?"":"COR
19220 52 45 4c 41 54 45 44 20 22 2c 20 70 53 65 6c 2d  RELATED ", pSel-
19230 3e 73 65 6c 49 64 29 29 3b 0a 20 20 6e 52 65 67  >selId));.  nReg
19240 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
19250 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e  _SELECT ? pSel->
19260 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  pEList->nExpr : 
19270 31 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  1;.  sqlite3Sele
19280 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
19290 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 0, pParse->nMe
192a0 6d 2b 31 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  m+1);.  pParse->
192b0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
192c0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
192d0 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
192e0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
192f0 5f 4d 65 6d 3b 0a 20 20 20 20 64 65 73 74 2e 69  _Mem;.    dest.i
19300 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50  Sdst = dest.iSDP
19310 61 72 6d 3b 0a 20 20 20 20 64 65 73 74 2e 6e 53  arm;.    dest.nS
19320 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  dst = nReg;.    
19330 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19340 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
19350 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64   dest.iSDParm, d
19360 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67  est.iSDParm+nReg
19370 2d 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  -1);.    VdbeCom
19380 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
19390 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
193a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
193b0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
193c0 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 73 71 6c  _Exists;.    sql
193d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
193e0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
193f0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
19400 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19410 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
19420 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 7d 0a   result"));.  }.
19430 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 4c 69 6d    if( pSel->pLim
19440 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  it ){.    /* The
19450 20 73 75 62 71 75 65 72 79 20 61 6c 72 65 61 64   subquery alread
19460 79 20 68 61 73 20 61 20 6c 69 6d 69 74 2e 20 20  y has a limit.  
19470 49 66 20 74 68 65 20 70 72 65 2d 65 78 69 73 74  If the pre-exist
19480 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 58 0a 20  ing limit is X. 
19490 20 20 20 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20     ** then make 
194a0 74 68 65 20 6e 65 77 20 6c 69 6d 69 74 20 58 3c  the new limit X<
194b0 3e 30 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  >0 so that the n
194c0 65 77 20 6c 69 6d 69 74 20 69 73 20 65 69 74 68  ew limit is eith
194d0 65 72 20 31 20 6f 72 20 30 20 2a 2f 0a 20 20 20  er 1 or 0 */.   
194e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
194f0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70  Parse->db;.    p
19500 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
19510 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
19520 45 52 2c 20 22 30 22 29 3b 0a 20 20 20 20 69 66  ER, "0");.    if
19530 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ( pLimit ){.    
19540 20 20 70 4c 69 6d 69 74 2d 3e 61 66 66 45 78 70    pLimit->affExp
19550 72 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  r = SQLITE_AFF_N
19560 55 4d 45 52 49 43 3b 0a 20 20 20 20 20 20 70 4c  UMERIC;.      pL
19570 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45  imit = sqlite3PE
19580 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e  xpr(pParse, TK_N
19590 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
195b0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
195c0 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e  , pSel->pLimit->
195d0 70 4c 65 66 74 2c 20 30 29 2c 20 70 4c 69 6d 69  pLeft, 0), pLimi
195e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
195f0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
19600 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
19610 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 53  ->pLeft);.    pS
19620 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  el->pLimit->pLef
19630 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 7d 65  t = pLimit;.  }e
19640 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
19650 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65 2d 65  here is no pre-e
19660 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 61 64  xisting limit ad
19670 64 20 61 20 6c 69 6d 69 74 20 6f 66 20 31 20 2a  d a limit of 1 *
19680 2f 0a 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 73  /.    pLimit = s
19690 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
196a0 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  e->db, TK_INTEGE
196b0 52 2c 20 22 31 22 29 3b 0a 20 20 20 20 70 53 65  R, "1");.    pSe
196c0 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
196d0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
196e0 20 54 4b 5f 4c 49 4d 49 54 2c 20 70 4c 69 6d 69   TK_LIMIT, pLimi
196f0 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 53 65  t, 0);.  }.  pSe
19700 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  l->iLimit = 0;. 
19710 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
19720 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
19730 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 72   &dest) ){.    r
19740 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
19750 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72  Expr->iTable = r
19760 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Reg = dest.iSDPa
19770 72 6d 3b 0a 20 20 45 78 70 72 53 65 74 56 56 41  rm;.  ExprSetVVA
19780 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
19790 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
197a0 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 7b 0a  if( addrOnce ){.
197b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
197c0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f  umpHere(v, addrO
197d0 6e 63 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75  nce);..    /* Su
197e0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
197f0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
19800 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
19810 65 74 75 72 6e 2c 20 70 45 78 70 72 2d 3e 79 2e  eturn, pExpr->y.
19820 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 3b 0a  sub.regReturn);.
19830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19840 68 61 6e 67 65 50 31 28 76 2c 20 70 45 78 70 72  hangeP1(v, pExpr
19850 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 2d 31 2c  ->y.sub.iAddr-1,
19860 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19870 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20  entAddr(v)-1);. 
19880 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
19890 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
198a0 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  se);.  }..  retu
198b0 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69  rn rReg;.}.#endi
198c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
198d0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
198e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
198f0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
19900 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20   Expr pIn is an 
19910 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  IN(...) expressi
19920 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
19930 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  n checks that th
19940 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
19950 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
19960 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72  he IN() operator
19970 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75   has the same nu
19980 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75  mber of .** colu
19990 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f  mns as the vecto
199a0 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72  r on the LHS. Or
199b0 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  , if the RHS of 
199c0 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20  the IN() is not 
199d0 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c  .** a sub-query,
199e0 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73   that the LHS is
199f0 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a   a vector of siz
19a00 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 1..*/.int sqli
19a10 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50  te3ExprCheckIN(P
19a20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
19a30 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20  pr *pIn){.  int 
19a40 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
19a50 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
19a60 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  pIn->pLeft);.  i
19a70 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26  f( (pIn->flags &
19a80 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
19a90 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f  {.    if( nVecto
19aa0 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63  r!=pIn->x.pSelec
19ab0 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
19ac0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19ad0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
19ae0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70  pParse, pIn->x.p
19af0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
19b00 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b  nExpr, nVector);
19b10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
19b20 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
19b30 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b  f( nVector!=1 ){
19b40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74  .    sqlite3Vect
19b50 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  orErrorMsg(pPars
19b60 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a  e, pIn->pLeft);.
19b70 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
19b80 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
19b90 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
19ba0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19bb0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
19bc0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
19bd0 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
19be0 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
19bf0 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
19c00 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
19c10 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
19c20 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
19c30 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
19c40 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f   scalar or vecto
19c50 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  r expression.  T
19c60 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e  he .** right-han
19c70 64 20 73 69 64 65 20 28 52 48 53 29 20 69 73 20  d side (RHS) is 
19c80 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
19c90 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20   or more scalar 
19ca0 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20  values, or a.** 
19cb0 73 75 62 71 75 65 72 79 2e 20 20 49 66 20 74 68  subquery.  If th
19cc0 65 20 52 48 53 20 69 73 20 61 20 73 75 62 71 75  e RHS is a subqu
19cd0 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  ery, the number 
19ce0 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
19cf0 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20  s must.** match 
19d00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
19d10 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63  lumns in the vec
19d20 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
19d30 20 49 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a   If the RHS is.*
19d40 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  * a list of valu
19d50 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74  es, the LHS must
19d60 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a   be a scalar. .*
19d70 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72  *.** The IN oper
19d80 61 74 6f 72 20 69 73 20 74 72 75 65 20 69 66 20  ator is true if 
19d90 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73  the LHS value is
19da0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
19db0 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68  n the RHS..** Th
19dc0 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73  e result is fals
19dd0 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
19de0 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69  definitely not i
19df0 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
19e00 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55  .** result is NU
19e10 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73 65 6e  LL if the presen
19e20 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ce of the LHS in
19e30 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20   the RHS cannot 
19e40 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  be .** determine
19e50 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a  d due to NULLs..
19e60 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
19e70 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
19e80 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  e that jumps to 
19e90 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
19ea0 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
19eb0 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
19ec0 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
19ed0 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
19ee0 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
19ef0 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
19f00 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
19f10 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
19f20 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
19f30 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
19f40 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
19f50 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
19f60 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a  fall through..**
19f70 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70 61  .** See the sepa
19f80 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72  rate in-operator
19f90 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .md documentatio
19fa0 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61  n file in the ca
19fb0 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74  nonical.** SQLit
19fc0 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f  e source tree fo
19fd0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
19fe0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
19ff0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
1a000 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61  ExprCodeIN(.  Pa
1a010 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1a020 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
1a030 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1a040 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1a050 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1a060 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
1a070 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1a080 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c  int destIfFalse,
1a090 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
1a0a0 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74  re if LHS is not
1a0b0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
1a0c0 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64  e RHS */.  int d
1a0d0 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20  estIfNull       
1a0e0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1a0f0 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
1a100 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20   unknown due to 
1a110 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULLs */.){.  in
1a120 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  t rRhsHasNull = 
1a130 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  0;  /* Register 
1a140 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20  that is true if 
1a150 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
1a160 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  L values */.  in
1a170 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
1a180 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
1a190 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
1a1a0 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  rLhs;           
1a1b0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29    /* Register(s)
1a1c0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53   holding the LHS
1a1d0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
1a1e0 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20   rLhsOrig;      
1a1f0 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73     /* LHS values
1a200 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65   prior to reorde
1a210 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20  ring by aiMap[] 
1a220 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
1a230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
1a240 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
1a250 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1a260 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20  int *aiMap = 0; 
1a270 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f        /* Map fro
1a280 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74  m vector field t
1a290 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a  o index column *
1a2a0 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d  /.  char *zAff =
1a2b0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66   0;       /* Aff
1a2c0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72  inity string for
1a2d0 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a   comparisons */.
1a2e0 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20    int nVector;  
1a2f0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1a300 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74  of vectors for t
1a310 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  his IN operator 
1a320 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b  */.  int iDummy;
1a330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75             /* Du
1a340 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f  mmy parameter to
1a350 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
1a360 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  ) */.  Expr *pLe
1a370 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ft;          /* 
1a380 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
1a390 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
1a3a0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1a3b0 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f        /* loop co
1a3c0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64  unter */.  int d
1a3d0 65 73 74 53 74 65 70 32 3b 20 20 20 20 20 20 20  estStep2;       
1a3e0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
1a3f0 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65  p when NULLs see
1a400 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20  n in step 2 */. 
1a410 20 69 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d   int destStep6 =
1a420 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20   0;    /* Start 
1a430 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70  of code for Step
1a440 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
1a450 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a  TruthOp;      /*
1a460 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f   Address of opco
1a470 64 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  de that determin
1a480 65 73 20 74 68 65 20 49 4e 20 69 73 20 74 72 75  es the IN is tru
1a490 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e  e */.  int destN
1a4a0 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20  otNull;      /* 
1a4b0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 20 63  Jump here if a c
1a4c0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
1a4d0 20 74 72 75 65 20 69 6e 20 73 74 65 70 20 36 20   true in step 6 
1a4e0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
1a4f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
1a500 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20  p of the step-6 
1a510 6c 6f 6f 70 20 2a 2f 20 0a 20 20 69 6e 74 20 69  loop */ .  int i
1a520 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
1a530 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 75 73 65   /* Index to use
1a540 20 2a 2f 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70   */..  pLeft = p
1a550 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
1a560 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
1a570 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45  eckIN(pParse, pE
1a580 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  xpr) ) return;. 
1a590 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66   zAff = exprINAf
1a5a0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
1a5b0 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72  Expr);.  nVector
1a5c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
1a5d0 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
1a5e0 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20  pLeft);.  aiMap 
1a5f0 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44  = (int*)sqlite3D
1a600 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  bMallocZero(.   
1a610 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e     pParse->db, n
1a620 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69  Vector*(sizeof(i
1a630 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  nt) + sizeof(cha
1a640 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69  r)) + 1.  );.  i
1a650 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
1a660 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
1a670 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  to sqlite3ExprCo
1a680 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a  deIN_oom_error;.
1a690 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
1a6a0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   compute the RHS
1a6b0 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65  . After this ste
1a6c0 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f  p, if anything o
1a6d0 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49  ther than.  ** I
1a6e0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
1a6f0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61  returned, the ta
1a700 62 6c 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ble opened with 
1a710 63 75 72 73 6f 72 20 69 54 61 62 0a 20 20 2a 2a  cursor iTab.  **
1a720 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
1a730 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
1a740 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e  p the RHS. If IN
1a750 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
1a760 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68  eturned,.  ** th
1a770 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65  e RHS has not ye
1a780 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a  t been coded.  *
1a790 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
1a7a0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
1a7b0 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
1a7c0 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
1a7d0 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
1a7e0 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
1a7f0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
1a800 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
1a810 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
1a820 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
1a830 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20  arse, pExpr,.   
1a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a850 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44            IN_IND
1a860 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20  EX_MEMBERSHIP | 
1a870 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
1a880 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1a8a0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1a8b0 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52  IfNull ? 0 : &rR
1a8c0 68 73 48 61 73 4e 75 6c 6c 2c 0a 20 20 20 20 20  hsHasNull,.     
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8e0 20 20 20 20 20 20 20 20 61 69 4d 61 70 2c 20 26          aiMap, &
1a8f0 69 54 61 62 29 3b 0a 0a 20 20 61 73 73 65 72 74  iTab);..  assert
1a900 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1a910 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20  | nVector==1 || 
1a920 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1a930 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  EPH.       || eT
1a940 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
1a950 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65  DEX_ASC || eType
1a960 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
1a970 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64  _DESC .  );.#ifd
1a980 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1a990 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61    /* Confirm tha
1a9a0 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69  t aiMap[] contai
1a9b0 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67  ns nVector integ
1a9c0 65 72 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  er values betwee
1a9d0 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65  n 0 and.  ** nVe
1a9e0 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72  ctor-1. */.  for
1a9f0 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1aa00 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
1aa10 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63  , cnt;.    for(c
1aa20 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f  nt=j=0; j<nVecto
1aa30 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61  r; j++) if( aiMa
1aa40 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b  p[j]==i ) cnt++;
1aa50 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6e 74  .    assert( cnt
1aa60 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ==1 );.  }.#endi
1aa70 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  f..  /* Code the
1aa80 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e   LHS, the <expr>
1aa90 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
1aaa0 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20   (...)". If the 
1aab0 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76  LHS is a .  ** v
1aac0 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69  ector, then it i
1aad0 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  s stored in an a
1aae0 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20  rray of nVector 
1aaf0 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
1ab00 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a  ng .  ** at r1..
1ab10 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65    **.  ** sqlite
1ab20 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d  3FindInIndex() m
1ab30 69 67 68 74 20 68 61 76 65 20 72 65 6f 72 64 65  ight have reorde
1ab40 72 65 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f  red the fields o
1ab50 66 20 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72  f the LHS vector
1ab60 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  .  ** so that th
1ab70 65 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20  e fields are in 
1ab80 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61  the same order a
1ab90 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e  s an existing in
1aba0 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20  dex.   The.  ** 
1abb0 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f  aiMap[] array co
1abc0 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67  ntains a mapping
1abd0 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
1abe0 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64  al LHS field ord
1abf0 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66  er to.  ** the f
1ac00 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20  ield order that 
1ac10 6d 61 74 63 68 65 73 20 74 68 65 20 52 48 53 20  matches the RHS 
1ac20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 72 4c  index..  */.  rL
1ac30 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64  hsOrig = exprCod
1ac40 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  eVector(pParse, 
1ac50 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b  pLeft, &iDummy);
1ac60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
1ac70 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69  ector && aiMap[i
1ac80 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20  ]==i; i++){} /* 
1ac90 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72  Are LHS fields r
1aca0 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69  eordered? */.  i
1acb0 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b  f( i==nVector ){
1acc0 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c  .    /* LHS fiel
1acd0 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64  ds are not reord
1ace0 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73  ered */.    rLhs
1acf0 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d   = rLhsOrig;.  }
1ad00 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  else{.    /* Nee
1ad10 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65  d to reorder the
1ad20 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f   LHS fields acco
1ad30 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a  rding to aiMap *
1ad40 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c  /.    rLhs = sql
1ad50 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
1ad60 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72  (pParse, nVector
1ad70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1ad80 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
1ad90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ada0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1adb0 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c  opy, rLhsOrig+i,
1adc0 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20   rLhs+aiMap[i], 
1add0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
1ade0 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69   /* If sqlite3Fi
1adf0 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20  ndInIndex() did 
1ae00 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61  not find or crea
1ae10 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  te an index that
1ae20 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c   is.  ** suitabl
1ae30 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  e for evaluating
1ae40 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
1ae50 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
1ae60 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71  using a.  ** seq
1ae70 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
1ae80 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  sons..  **.  ** 
1ae90 54 68 69 73 20 69 73 20 73 74 65 70 20 28 31 29  This is step (1)
1aea0 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61   in the in-opera
1aeb0 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64  tor.md optimized
1aec0 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f   algorithm..  */
1aed0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e  .  if( eType==IN
1aee0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20  _INDEX_NOOP ){. 
1aef0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
1af00 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
1af10 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  ist;.    CollSeq
1af20 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
1af30 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1af40 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1af50 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65  t);.    int labe
1af60 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lOk = sqlite3Vdb
1af70 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
1af80 65 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20  e);.    int r2, 
1af90 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69  regToFree;.    i
1afa0 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30  nt regCkNull = 0
1afb0 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
1afc0 20 20 69 6e 74 20 62 4c 68 73 52 65 61 6c 3b 20    int bLhsReal; 
1afd0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1afe0 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 68 61  LHS of the IN ha
1aff0 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 20  s REAL affinity 
1b000 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
1b010 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1b020 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1b030 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
1b040 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
1b050 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
1b060 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c   regCkNull = sql
1b070 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1b080 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1b090 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b0a0 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c  v, OP_BitAnd, rL
1b0b0 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e  hs, rLhs, regCkN
1b0c0 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ull);.    }.    
1b0d0 62 4c 68 73 52 65 61 6c 20 3d 20 73 71 6c 69 74  bLhsReal = sqlit
1b0e0 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1b0f0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3d 3d 53 51  Expr->pLeft)==SQ
1b100 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
1b110 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1b120 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69  pList->nExpr; ii
1b130 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  ++){.      if( b
1b140 4c 68 73 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  LhsReal ){.     
1b150 20 20 20 72 32 20 3d 20 72 65 67 54 6f 46 72 65     r2 = regToFre
1b160 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
1b170 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1b180 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1b190 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1b1a0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
1b1b0 72 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  r, r2);.        
1b1c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b1d0 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  4(v, OP_Affinity
1b1e0 2c 20 72 32 2c 20 31 2c 20 30 2c 20 22 45 22 2c  , r2, 1, 0, "E",
1b1f0 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1b200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b210 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1b220 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1b230 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  e, pList->a[ii].
1b240 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65  pExpr, &regToFre
1b250 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1b260 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
1b270 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
1b280 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61  nBeNull(pList->a
1b290 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
1b2a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b2b0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
1b2c0 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c  itAnd, regCkNull
1b2d0 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  , r2, regCkNull)
1b2e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b2f0 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  if( ii<pList->nE
1b300 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e  xpr-1 || destIfN
1b310 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
1b320 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b330 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1b340 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61   OP_Eq, rLhs, la
1b350 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20  belOk, r2,.     
1b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b370 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
1b380 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1b390 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1b3a0 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69  rageIf(v, ii<pLi
1b3b0 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
1b3c0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b3d0 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73  geIf(v, ii==pLis
1b3e0 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
1b3f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b400 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
1b410 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
1b420 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
1b430 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  t( destIfNull==d
1b440 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20  estIfFalse );.  
1b450 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b460 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
1b470 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61  , rLhs, destIfFa
1b480 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lse, r2,.       
1b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4a0 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
1b4b0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64   P4_COLLSEQ); Vd
1b4c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b4d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b4e0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
1b4f0 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a  ff[0] | SQLITE_J
1b500 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1b510 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1b520 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1b530 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65  pParse, regToFre
1b540 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
1b550 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20  ( regCkNull ){. 
1b560 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b570 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
1b580 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  ull, regCkNull, 
1b590 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
1b5a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b5b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1b5c0 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
1b5d0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se);.    }.    s
1b5e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1b5f0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f  eLabel(v, labelO
1b600 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  k);.    sqlite3R
1b610 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1b620 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  arse, regCkNull)
1b630 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74  ;.    goto sqlit
1b640 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1b650 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ished;.  }..  /*
1b660 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74   Step 2: Check t
1b670 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53  o see if the LHS
1b680 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
1b690 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20  LL columns.  If 
1b6a0 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65  the.  ** LHS doe
1b6b0 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20  s contain NULLs 
1b6c0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1b6d0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46  must be either F
1b6e0 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20  ALSE or NULL..  
1b6f0 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20  ** We will then 
1b700 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20  skip the binary 
1b710 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48  search of the RH
1b720 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
1b730 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
1b740 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73  False ){.    des
1b750 74 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46  tStep2 = destIfF
1b760 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  alse;.  }else{. 
1b770 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
1b780 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74  estStep6 = sqlit
1b790 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1b7a0 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 66  pParse);.  }.  f
1b7b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
1b7c0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
1b7d0 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65  r *p = sqlite3Ve
1b7e0 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
1b7f0 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69  (pExpr->pLeft, i
1b800 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
1b810 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
1b820 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  p) ){.      sqli
1b830 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b840 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73   OP_IsNull, rLhs
1b850 2b 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a  +i, destStep2);.
1b860 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b870 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ge(v);.    }.  }
1b880 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20  ..  /* Step 3.  
1b890 54 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b  The LHS is now k
1b8a0 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e  nown to be non-N
1b8b0 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e  ULL.  Do the bin
1b8c0 61 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20  ary search.  ** 
1b8d0 6f 66 20 74 68 65 20 52 48 53 20 75 73 69 6e 67  of the RHS using
1b8e0 20 74 68 65 20 4c 48 53 20 61 73 20 61 20 70 72   the LHS as a pr
1b8f0 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20  obe.  If found, 
1b900 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20  the result is.  
1b910 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  ** true..  */.  
1b920 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
1b930 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
1b940 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
1b950 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65  , the RHS is the
1b960 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20   ROWID of table 
1b970 62 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65  b-tree and so we
1b980 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f   also.    ** kno
1b990 77 20 74 68 61 74 20 74 68 65 20 52 48 53 20 69  w that the RHS i
1b9a0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e  s non-NULL.  Hen
1b9b0 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73  ce, we combine s
1b9c0 74 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20  teps 3 and 4.   
1b9d0 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c   ** into a singl
1b9e0 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  e opcode. */.   
1b9f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ba00 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
1ba10 69 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66  id, iTab, destIf
1ba20 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20  False, rLhs);.  
1ba30 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1ba40 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74 68  );.    addrTruth
1ba50 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
1ba60 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
1ba70 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54  o);  /* Return T
1ba80 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  rue */.  }else{.
1ba90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1baa0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
1bab0 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63  nity, rLhs, nVec
1bac0 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56  tor, 0, zAff, nV
1bad0 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ector);.    if( 
1bae0 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
1baf0 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  tIfNull ){.     
1bb00 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70   /* Combine Step
1bb10 20 33 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e   3 and Step 5 in
1bb20 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  to a single opco
1bb30 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  de */.      sqli
1bb40 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1bb50 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
1bb60 20 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c   iTab, destIfFal
1bb70 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1bb90 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56  Lhs, nVector); V
1bba0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1bbb0 20 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74        goto sqlit
1bbc0 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1bbd0 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ished;.    }.   
1bbe0 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65   /* Ordinary Ste
1bbf0 70 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73  p 3, for the cas
1bc00 65 20 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e  e where FALSE an
1bc10 64 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69  d NULL are disti
1bc20 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54  nct */.    addrT
1bc30 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33  ruthOp = sqlite3
1bc40 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1bc50 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c   OP_Found, iTab,
1bc60 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc80 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20            rLhs, 
1bc90 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f  nVector); VdbeCo
1bca0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
1bcb0 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66    /* Step 4.  If
1bcc0 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77   the RHS is know
1bcd0 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  n to be non-NULL
1bce0 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20   and we did not 
1bcf0 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74  find.  ** an mat
1bd00 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68  ch on the search
1bd10 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
1bd20 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
1bd30 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66  FALSE..  */.  if
1bd40 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26  ( rRhsHasNull &&
1bd50 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20   nVector==1 ){. 
1bd60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bd70 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
1bd80 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  ll, rRhsHasNull,
1bd90 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1bda0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1bdb0 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  v);.  }..  /* St
1bdc0 65 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20  ep 5.  If we do 
1bdd0 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
1bde0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1bdf0 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20  tween NULL and. 
1be00 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20   ** FALSE, then 
1be10 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73  just return fals
1be20 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e. .  */.  if( d
1be30 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1be40 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33  IfNull ) sqlite3
1be50 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
1be60 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20  IfFalse);..  /* 
1be70 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72  Step 6: Loop thr
1be80 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65  ough rows of the
1be90 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65   RHS.  Compare e
1bea0 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c  ach row to the L
1beb0 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20  HS..  ** If any 
1bec0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55  comparison is NU
1bed0 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  LL, then the res
1bee0 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66  ult is NULL.  If
1bef0 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72   all.  ** compar
1bf00 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20  isons are FALSE 
1bf10 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72  then the final r
1bf20 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a  esult is FALSE..
1bf30 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20    **.  ** For a 
1bf40 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69  scalar LHS, it i
1bf50 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
1bf60 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66  check just the f
1bf70 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66  irst row.  ** of
1bf80 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
1bf90 20 69 66 28 20 64 65 73 74 53 74 65 70 36 20 29   if( destStep6 )
1bfa0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1bfb0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1bfc0 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f  Step6);.  addrTo
1bfd0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
1bfe0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
1bff0 6e 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66  nd, iTab, destIf
1c000 46 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f  False);.  VdbeCo
1c010 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
1c020 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20   nVector>1 ){.  
1c030 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20    destNotNull = 
1c040 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1c050 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
1c060 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f  }else{.    /* Fo
1c070 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f  r nVector==1, co
1c080 6d 62 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e  mbine steps 6 an
1c090 64 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65  d 7 by immediate
1c0a0 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20  ly returning.   
1c0b0 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65   ** FALSE if the
1c0c0 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f   first compariso
1c0d0 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  n is not NULL */
1c0e0 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  .    destNotNull
1c0f0 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   = destIfFalse;.
1c100 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1c110 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
1c120 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
1c130 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1c140 0a 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71  .    int r3 = sq
1c150 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1c160 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d  pParse);.    p =
1c170 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
1c180 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
1c190 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  , i);.    pColl 
1c1a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1c1b0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
1c1c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c1d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1c1e0 75 6d 6e 2c 20 69 54 61 62 2c 20 69 2c 20 72 33  umn, iTab, i, r3
1c1f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1c200 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e  beAddOp4(v, OP_N
1c210 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e  e, rLhs+i, destN
1c220 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20  otNull, r3,.    
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c240 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
1c250 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
1c260 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1c270 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1c280 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1c290 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73  se, r3);.  }.  s
1c2a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c2b0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1c2c0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69  destIfNull);.  i
1c2d0 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a  f( nVector>1 ){.
1c2e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1c2f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1c300 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20  estNotNull);.   
1c310 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c320 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
1c330 54 61 62 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Tab, addrTop+1);
1c340 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1c350 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74  e(v);..    /* St
1c360 65 70 20 37 3a 20 20 49 66 20 77 65 20 72 65 61  ep 7:  If we rea
1c370 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  ch this point, w
1c380 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
1c390 72 65 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20  result must.    
1c3a0 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a  ** be false. */.
1c3b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c3c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1c3d0 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65  , 0, destIfFalse
1c3e0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
1c3f0 70 73 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72  ps here in order
1c400 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e   to return true.
1c410 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1c420 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1c430 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69  rTruthOp);..sqli
1c440 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69  te3ExprCodeIN_fi
1c450 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c  nished:.  if( rL
1c460 68 73 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73  hs!=rLhsOrig ) s
1c470 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1c480 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68  pReg(pParse, rLh
1c490 73 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  s);.  VdbeCommen
1c4a0 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78  t((v, "end IN ex
1c4b0 70 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78  pr"));.sqlite3Ex
1c4c0 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72  prCodeIN_oom_err
1c4d0 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
1c4e0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1c4f0 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  aiMap);.  sqlite
1c500 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
1c510 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e  db, zAff);.}.#en
1c520 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1c530 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
1c540 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c550 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1c560 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  NT./*.** Generat
1c570 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
1c580 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
1c590 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  he floating poin
1c5a0 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72  t.** value descr
1c5b0 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31  ibed by z[0..n-1
1c5c0 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
1c5d0 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iMem..**.** The 
1c5e0 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20  z[] string will 
1c5f0 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20  probably not be 
1c600 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
1c610 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b    But the .** z[
1c620 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20  n] character is 
1c630 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1c640 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
1c650 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a  does not look.**
1c660 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e   like the contin
1c670 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75  uation of the nu
1c680 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
1c690 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64  void codeReal(Vd
1c6a0 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
1c6b0 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65  r *z, int negate
1c6c0 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
1c6d0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21  .  if( ALWAYS(z!
1c6e0 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  =0) ){.    doubl
1c6f0 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c  e value;.    sql
1c700 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c  ite3AtoF(z, &val
1c710 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ue, sqlite3Strle
1c720 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
1c730 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TF8);.    assert
1c740 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  ( !sqlite3IsNaN(
1c750 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65  value) ); /* The
1c760 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20   new AtoF never 
1c770 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20  returns NaN */. 
1c780 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61     if( negateFla
1c790 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
1c7a0 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ue;.    sqlite3V
1c7b0 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
1c7c0 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65   OP_Real, 0, iMe
1c7d0 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75  m, 0, (u8*)&valu
1c7e0 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d  e, P4_REAL);.  }
1c7f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1c800 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
1c810 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
1c820 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65  ill put the inte
1c830 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a  ger describe by.
1c840 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31  ** text z[0..n-1
1c850 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
1c860 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72  iMem..**.** Expr
1c870 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77  .u.zToken is alw
1c880 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72  ays UTF8 and zer
1c890 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f  o-terminated..*/
1c8a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
1c8b0 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a  eInteger(Parse *
1c8c0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1c8d0 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67  xpr, int negFlag
1c8e0 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56  , int iMem){.  V
1c8f0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1c900 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45  >pVdbe;.  if( pE
1c910 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
1c920 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
1c930 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75  int i = pExpr->u
1c940 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73  .iValue;.    ass
1c950 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20  ert( i>=0 );.   
1c960 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69   if( negFlag ) i
1c970 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74   = -i;.    sqlit
1c980 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c990 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69  OP_Integer, i, i
1c9a0 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Mem);.  }else{. 
1c9b0 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36     int c;.    i6
1c9c0 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e  4 value;.    con
1c9d0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78  st char *z = pEx
1c9e0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1c9f0 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
1ca00 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  ;.    c = sqlite
1ca10 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
1ca20 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69  , &value);.    i
1ca30 66 28 20 28 63 3d 3d 33 20 26 26 20 21 6e 65 67  f( (c==3 && !neg
1ca40 46 6c 61 67 29 20 7c 7c 20 28 63 3d 3d 32 29 20  Flag) || (c==2) 
1ca50 7c 7c 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76  || (negFlag && v
1ca60 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49  alue==SMALLEST_I
1ca70 4e 54 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53  NT64)){.#ifdef S
1ca80 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1ca90 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
1caa0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1cab0 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a  pParse, "oversiz
1cac0 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73  ed integer: %s%s
1cad0 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22  ", negFlag ? "-"
1cae0 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65   : "", z);.#else
1caf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cb00 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52  OMIT_HEX_INTEGER
1cb10 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1cb20 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30  e3_strnicmp(z,"0
1cb30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",2)==0 ){.    
1cb40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1cb50 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68 65 78  Msg(pParse, "hex
1cb60 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67   literal too big
1cb70 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67  : %s%s", negFlag
1cb80 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20  ?"-":"",z);.    
1cb90 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1cba0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63       {.        c
1cbb0 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65  odeReal(v, z, ne
1cbc0 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  gFlag, iMem);.  
1cbd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1cbe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
1cbf0 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c  ( negFlag ){ val
1cc00 75 65 20 3d 20 63 3d 3d 33 20 3f 20 53 4d 41 4c  ue = c==3 ? SMAL
1cc10 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61  LEST_INT64 : -va
1cc20 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c  lue; }.      sql
1cc30 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
1cc40 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p8(v, OP_Int64, 
1cc50 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a  0, iMem, 0, (u8*
1cc60 29 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36  )&value, P4_INT6
1cc70 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  4);.    }.  }.}.
1cc80 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1cc90 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61  de that will loa
1cca0 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  d into register 
1ccb0 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74  regOut a value t
1ccc0 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70  hat is.** approp
1ccd0 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49  riate for the iI
1cce0 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20  dxCol-th column 
1ccf0 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
1cd00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1cd10 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43  prCodeLoadIndexC
1cd20 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1cd30 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20  pParse,  /* The 
1cd40 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1cd50 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
1cd60 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  ,    /* The inde
1cd70 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69  x whose column i
1cd80 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  s to be loaded *
1cd90 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
1cda0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1cdb0 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  inting to a tabl
1cdc0 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  e row */.  int i
1cdd0 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68  IdxCol,    /* Th
1cde0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1cdf0 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64  index to be load
1ce00 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ed */.  int regO
1ce10 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  ut      /* Store
1ce20 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
1ce30 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  n value in this 
1ce40 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1ce50 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70   i16 iTabCol = p
1ce60 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49  Idx->aiColumn[iI
1ce70 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54  dxCol];.  if( iT
1ce80 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29  abCol==XN_EXPR )
1ce90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
1cea0 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a  dx->aColExpr );.
1ceb0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1cec0 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70  ->aColExpr->nExp
1ced0 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20  r>iIdxCol );.   
1cee0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1cef0 62 20 3d 20 69 54 61 62 43 75 72 20 2b 20 31 3b  b = iTabCur + 1;
1cf00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1cf10 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c  CodeCopy(pParse,
1cf20 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1cf30 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70  >a[iIdxCol].pExp
1cf40 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20  r, regOut);.    
1cf50 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1cf60 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1cf70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1cf80 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1cf90 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  le(pParse->pVdbe
1cfa0 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20  , pIdx->pTable, 
1cfb0 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20  iTabCur,.       
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
1cfe0 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCol, regOut);. 
1cff0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1d000 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74  rate code to ext
1d010 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ract the value o
1d020 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
1d030 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e  lumn of a table.
1d040 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d050 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1d060 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65  nOfTable(.  Vdbe
1d070 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *v,        /* T
1d080 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
1d090 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1d0a0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1d0b0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e  /* The table con
1d0c0 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
1d0d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  e */.  int iTabC
1d0e0 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ur,    /* The ta
1d0f0 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20  ble cursor.  Or 
1d100 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f  the PK cursor fo
1d110 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
1d120 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
1d130 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1d140 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65   the column to e
1d150 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20  xtract */.  int 
1d160 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45  regOut      /* E
1d170 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1d180 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
1d190 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ter */.){.  if( 
1d1a0 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
1d1b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1d1c0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
1d1d0 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65  TabCur, iCol, re
1d1e0 67 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72  gOut);.    retur
1d1f0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  n;.  }.  if( iCo
1d200 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61  l<0 || iCol==pTa
1d210 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
1d220 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d230 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
1d240 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b  TabCur, regOut);
1d250 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1d260 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c  t op = IsVirtual
1d270 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c  (pTab) ? OP_VCol
1d280 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b  umn : OP_Column;
1d290 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f  .    int x = iCo
1d2a0 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52  l;.    if( !HasR
1d2b0 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 21 49  owid(pTab) && !I
1d2c0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1d2d0 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69  {.      x = sqli
1d2e0 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1d2f0 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b  (sqlite3PrimaryK
1d300 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69  eyIndex(pTab), i
1d310 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
1d320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d330 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72  3(v, op, iTabCur
1d340 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  , x, regOut);.  
1d350 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
1d360 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
1d370 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
1d380 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75  Tab, iCol, regOu
1d390 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1d3a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1d3b0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
1d3c0 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
1d3d0 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
1d3e0 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74  able pTab and st
1d3f0 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
1d400 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
1d410 20 69 52 65 67 2e 20 0a 2a 2a 0a 2a 2a 20 54 68   iReg. .**.** Th
1d420 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
1d430 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54  pen cursor to pT
1d440 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65  ab in iTable whe
1d450 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
1d460 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66  * is called.  If
1d470 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20   iColumn<0 then 
1d480 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
1d490 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20  d that extracts 
1d4a0 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  the rowid..*/.in
1d4b0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
1d4c0 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  eGetColumn(.  Pa
1d4d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
1d4e0 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1d4f0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1d500 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
1d510 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
1d520 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1d530 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
1d540 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
1d550 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
1d560 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1d570 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
1d580 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1d590 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1d5a0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
1d5b0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1d5c0 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f  t iReg,        /
1d5d0 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
1d5e0 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20  here */.  u8 p5 
1d5f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35             /* P5
1d600 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f   value for OP_Co
1d610 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a  lumn + FLAGS */.
1d620 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1d630 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1d640 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
1d650 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1d660 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1d670 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c  e(v, pTab, iTabl
1d680 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
1d690 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20  );.  if( p5 ){. 
1d6a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1d6b0 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20  angeP5(v, p5);. 
1d6c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
1d6d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1d6e0 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65  ate code to move
1d6f0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65   content from re
1d700 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e  gisters iFrom...
1d710 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20  iFrom+nReg-1.** 
1d720 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f  over to iTo..iTo
1d730 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64  +nReg-1..*/.void
1d740 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d750 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  Move(Parse *pPar
1d760 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
1d770 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67  nt iTo, int nReg
1d780 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72  ){.  assert( iFr
1d790 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20  om>=iTo+nReg || 
1d7a0 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20  iFrom+nReg<=iTo 
1d7b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d7c0 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70  AddOp3(pParse->p
1d7d0 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69  Vdbe, OP_Move, i
1d7e0 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29  From, iTo, nReg)
1d7f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
1d800 72 74 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  rt a scalar expr
1d810 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61  ession node to a
1d820 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66   TK_REGISTER ref
1d830 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69  erencing.** regi
1d840 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 65 20  ster iReg.  The 
1d850 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
1d860 72 65 20 74 68 61 74 20 69 52 65 67 20 61 6c 72  re that iReg alr
1d870 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  eady contains.**
1d880 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1d890 75 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ue for the expre
1d8a0 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssion..*/.static
1d8b0 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69   void exprToRegi
1d8c0 73 74 65 72 28 45 78 70 72 20 2a 70 45 78 70 72  ster(Expr *pExpr
1d8d0 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 45  , int iReg){.  E
1d8e0 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
1d8f0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41  ExprSkipCollateA
1d900 6e 64 4c 69 6b 65 6c 79 28 70 45 78 70 72 29 3b  ndLikely(pExpr);
1d910 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f  .  p->op2 = p->o
1d920 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  p;.  p->op = TK_
1d930 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69  REGISTER;.  p->i
1d940 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20  Table = iReg;.  
1d950 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
1d960 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d  y(p, EP_Skip);.}
1d970 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65  ../*.** Evaluate
1d980 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28   an expression (
1d990 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20  either a vector 
1d9a0 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  or a scalar expr
1d9b0 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72  ession) and stor
1d9c0 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
1d9d0 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74  in continguous t
1d9e0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1d9f0 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  rs.  Return the 
1da00 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
1da10 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 75  first register u
1da20 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
1da30 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49   result..**.** I
1da40 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1da50 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
1da60 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63  s a temporary sc
1da70 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20  alar, then also 
1da80 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65  write.** that re
1da90 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e  gister number in
1daa0 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20  to *piFreeable. 
1dab0 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   If the returned
1dac0 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
1dad0 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  .** is not a tem
1dae0 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68 65  porary or if the
1daf0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
1db00 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46   vector set *piF
1db10 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e  reeable.** to 0.
1db20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
1db30 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61  xprCodeVector(Pa
1db40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1db50 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65  r *p, int *piFre
1db60 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52  eable){.  int iR
1db70 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65  esult;.  int nRe
1db80 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  sult = sqlite3Ex
1db90 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b  prVectorSize(p);
1dba0 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d  .  if( nResult==
1dbb0 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74  1 ){.    iResult
1dbc0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1dbd0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1dbe0 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20  , piFreeable);. 
1dbf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46   }else{.    *piF
1dc00 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  reeable = 0;.   
1dc10 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   if( p->op==TK_S
1dc20 45 4c 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c  ELECT ){.#if SQL
1dc30 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1dc40 59 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  Y.      iResult 
1dc50 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  = 0;.#else.     
1dc60 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   iResult = sqlit
1dc70 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
1dc80 70 50 61 72 73 65 2c 20 70 29 3b 0a 23 65 6e 64  pParse, p);.#end
1dc90 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1dca0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1dcb0 20 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73   iResult = pPars
1dcc0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
1dcd0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1dce0 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20   nResult;.      
1dcf0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
1dd00 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  lt; i++){.      
1dd10 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1dd20 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61 72  eFactorable(pPar
1dd30 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  se, p->x.pList->
1dd40 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52  a[i].pExpr, i+iR
1dd50 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a  esult);.      }.
1dd60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1dd70 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a  rn iResult;.}...
1dd80 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1dd90 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72  ode into the cur
1dda0 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61  rent Vdbe to eva
1ddb0 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a  luate the given.
1ddc0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
1ddd0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65  Attempt to store
1dde0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1ddf0 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74  register "target
1de00 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  "..** Return the
1de10 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20   register where 
1de20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
1de30 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74  ed..**.** With t
1de40 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
1de50 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74  re is no guarant
1de60 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20  ee that results 
1de70 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65  will.** be store
1de80 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68  d in target.  Th
1de90 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62  e result might b
1dea0 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65  e stored in some
1deb0 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74   other.** regist
1dec0 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76  er if it is conv
1ded0 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e  enient to do so.
1dee0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
1def0 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63  nction.** must c
1df00 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
1df10 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  code and move th
1df20 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
1df30 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69   desired.** regi
1df40 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ster..*/.int sql
1df50 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1df60 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  et(Parse *pParse
1df70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1df80 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
1df90 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1dfa0 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56  pVdbe;  /* The V
1dfb0 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  M under construc
1dfc0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
1dfd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dfe0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
1dff0 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
1e000 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74  .  int inReg = t
1e010 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  arget;       /* 
1e020 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69  Results stored i
1e030 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67  n register inReg
1e040 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
1e050 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
1e060 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
1e070 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
1e080 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
1e090 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
1e0a0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
1e0b0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
1e0c0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
1e0d0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1e0e0 72 31 2c 20 72 32 3b 20 20 20 20 20 20 20 20 20  r1, r2;         
1e0f0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
1e100 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
1e110 73 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70  s */.  Expr temp
1e120 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1e130 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78   /* Temporary ex
1e140 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f  pression node */
1e150 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a  .  int p5 = 0;..
1e160 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
1e170 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
1e180 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
1e190 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
1e1a0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1e1b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e1c0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
1e1d0 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f 63 6f 64 65  ;.  }..expr_code
1e1e0 5f 64 6f 6f 76 65 72 3a 0a 20 20 69 66 28 20 70  _doover:.  if( p
1e1f0 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  Expr==0 ){.    o
1e200 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d  p = TK_NULL;.  }
1e210 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70  else{.    op = p
1e220 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20  Expr->op;.  }.  
1e230 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1e240 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
1e250 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  LUMN: {.      Ag
1e260 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
1e270 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
1e280 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
1e290 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
1e2a0 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
1e2b0 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  Col[pExpr->iAgg]
1e2c0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
1e2d0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
1e2e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1e2f0 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e  ert( pCol->iMem>
1e300 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  0 );.        ret
1e310 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a  urn pCol->iMem;.
1e320 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e330 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
1e340 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
1e350 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e360 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1e370 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72  n, pAggInfo->sor
1e380 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20  tingIdxPTab,.   
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1e3b0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
1e3c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1e3d0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1e3e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
1e3f0 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
1e400 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
1e410 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
1e420 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e430 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
1e440 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45     int iTab = pE
1e450 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
1e460 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1e470 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e480 5f 46 69 78 65 64 43 6f 6c 29 20 29 7b 0a 20 20  _FixedCol) ){.  
1e490 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 43 4f        /* This CO
1e4a0 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  LUMN expression 
1e4b0 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6e 73  is really a cons
1e4c0 74 61 6e 74 20 64 75 65 20 74 6f 20 57 48 45 52  tant due to WHER
1e4d0 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  E clause.       
1e4e0 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c   ** constraints,
1e4f0 20 61 6e 64 20 74 68 61 74 20 63 6f 6e 73 74 61   and that consta
1e500 6e 74 20 69 73 20 63 6f 64 65 64 20 62 79 20 74  nt is coded by t
1e510 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 0a  he pExpr->pLeft.
1e520 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
1e530 73 73 73 69 6f 6e 2e 20 20 48 6f 77 65 76 65 72  sssion.  However
1e540 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1e550 63 6f 6e 73 74 61 6e 74 20 68 61 73 20 74 68 65  constant has the
1e560 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 20   correct.       
1e570 20 2a 2a 20 64 61 74 61 74 79 70 65 20 62 79 20   ** datatype by 
1e580 61 70 70 6c 79 69 6e 67 20 74 68 65 20 41 66 66  applying the Aff
1e590 69 6e 69 74 79 20 6f 66 20 74 68 65 20 74 61 62  inity of the tab
1e5a0 6c 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65  le column to the
1e5b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  .        ** cons
1e5c0 74 61 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tant..        */
1e5d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 65  .        int iRe
1e5e0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1e5f0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1e600 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 74  , pExpr->pLeft,t
1e610 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1e620 69 6e 74 20 61 66 66 20 3d 20 73 71 6c 69 74 65  int aff = sqlite
1e630 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69  3TableColumnAffi
1e640 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54  nity(pExpr->y.pT
1e650 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ab, pExpr->iColu
1e660 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mn);.        if(
1e670 20 61 66 66 3e 53 51 4c 49 54 45 5f 41 46 46 5f   aff>SQLITE_AFF_
1e680 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
1e690 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1e6a0 68 61 72 20 7a 41 66 66 5b 5d 20 3d 20 22 42 5c  har zAff[] = "B\
1e6b0 30 30 30 43 5c 30 30 30 44 5c 30 30 30 45 22 3b  000C\000D\000E";
1e6c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1e6d0 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  t( SQLITE_AFF_BL
1e6e0 4f 42 3d 3d 27 41 27 20 29 3b 0a 20 20 20 20 20  OB=='A' );.     
1e6f0 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
1e700 49 54 45 5f 41 46 46 5f 54 45 58 54 3d 3d 27 42  ITE_AFF_TEXT=='B
1e710 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ' );.          i
1e720 66 28 20 69 52 65 67 21 3d 74 61 72 67 65 74 20  f( iReg!=target 
1e730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1e740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e750 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 52  (v, OP_SCopy, iR
1e760 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
1e770 20 20 20 20 20 20 20 20 20 69 52 65 67 20 3d 20           iReg = 
1e780 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 20 20  target;.        
1e790 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
1e7a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1e7b0 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
1e7c0 69 52 65 67 2c 20 31 2c 20 30 2c 0a 20 20 20 20  iReg, 1, 0,.    
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7e0 20 20 20 20 20 20 20 20 26 7a 41 66 66 5b 28 61          &zAff[(a
1e7f0 66 66 2d 27 42 27 29 2a 32 5d 2c 20 50 34 5f 53  ff-'B')*2], P4_S
1e800 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
1e810 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
1e820 20 69 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20   iReg;.      }. 
1e830 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20       if( iTab<0 
1e840 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1e850 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c  Parse->iSelfTab<
1e860 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1e870 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1e880 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1e890 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1e8a0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1e8b0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
1e8c0 72 74 28 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  rt( pExpr->y.pTa
1e8d0 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b!=0 );.        
1e8e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e8f0 3e 69 43 6f 6c 75 6d 6e 3e 3d 58 4e 5f 52 4f 57  >iColumn>=XN_ROW
1e900 49 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ID );.          
1e910 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
1e920 43 6f 6c 75 6d 6e 3c 70 45 78 70 72 2d 3e 79 2e  Column<pExpr->y.
1e930 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
1e940 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
1e950 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  r->iColumn>=0.  
1e960 20 20 20 20 20 20 20 20 20 20 26 26 20 70 45 78            && pEx
1e970 70 72 2d 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c  pr->y.pTab->aCol
1e980 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1e990 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
1e9a0 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
1e9b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1e9c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e9d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1e9e0 79 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  y, pExpr->iColum
1e9f0 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  n - pParse->iSel
1ea00 66 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  fTab,.          
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 20 20 20 20 74 61 72 67 65 74 29 3b 0a 20 20 20      target);.   
1ea30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ea40 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1ea50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74  _RealAffinity, t
1ea60 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1ea70 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1ea80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  t;.          }el
1ea90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1eaa0 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 43  return pExpr->iC
1eab0 6f 6c 75 6d 6e 20 2d 20 70 50 61 72 73 65 2d 3e  olumn - pParse->
1eac0 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20  iSelfTab;.      
1ead0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1eae0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1eaf0 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1eb00 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1eb10 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1eb20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1eb30 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1eb40 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1eb50 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1eb60 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1eb70 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1eb80 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1eb90 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1eba0 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 1;.        }. 
1ebb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1ebc0 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1ebd0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1ebe0 72 73 65 2c 20 70 45 78 70 72 2d 3e 79 2e 70 54  rse, pExpr->y.pT
1ebf0 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
1ec20 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c  n, iTab, target,
1ec30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20  pExpr->op2);.   
1ec60 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1ec70 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
1ec80 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
1ec90 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61  se, pExpr, 0, ta
1eca0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1ecb0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1ecc0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
1ecd0 55 45 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20  UEFALSE: {.     
1ece0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ecf0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1ed00 2c 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  , sqlite3ExprTru
1ed10 74 68 56 61 6c 75 65 28 70 45 78 70 72 29 2c 20  thValue(pExpr), 
1ed20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1ed30 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1ed40 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1ed50 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1ed60 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
1ed70 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
1ed80 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1ed90 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1eda0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1edb0 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  ;.      codeReal
1edc0 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (v, pExpr->u.zTo
1edd0 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ken, 0, target);
1ede0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1edf0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
1ee00 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  if.    case TK_S
1ee10 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61  TRING: {.      a
1ee20 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1ee30 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1ee40 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1ee50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ee60 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61  LoadString(v, ta
1ee70 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  rget, pExpr->u.z
1ee80 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72 65  Token);.      re
1ee90 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1eea0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1eeb0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
1eec0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1eed0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
1eee0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1eef0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1ef00 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1ef10 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
1ef20 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
1ef30 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
1ef40 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
1ef50 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
1ef60 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
1ef70 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1ef80 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1ef90 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1efa0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1efb0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1efc0 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72  0]=='x' || pExpr
1efd0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1efe0 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
1eff0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1f000 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ken[1]=='\'' );.
1f010 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72        z = &pExpr
1f020 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
1f030 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
1f040 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b  Strlen30(z) - 1;
1f050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1f060 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [n]=='\'' );.   
1f070 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
1f080 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
1f090 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
1f0a0 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
1f0b0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1f0c0 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
1f0d0 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
1f0e0 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
1f0f0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1f100 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1f110 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
1f120 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  BLE: {.      ass
1f130 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1f140 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1f150 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1f160 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1f170 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b  ->u.zToken!=0 );
1f180 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f190 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1f1a0 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  ]!=0 );.      sq
1f1b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f1c0 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
1f1d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
1f1e0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
1f1f0 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
1f200 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
1f210 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1f220 7a 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74  z = sqlite3VList
1f230 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65  NumToName(pParse
1f240 2d 3e 70 56 4c 69 73 74 2c 20 70 45 78 70 72 2d  ->pVList, pExpr-
1f250 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1f260 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1f270 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1f280 3f 27 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78  ?' || strcmp(pEx
1f290 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29  pr->u.zToken, z)
1f2a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
1f2b0 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d  Parse->pVList[0]
1f2c0 20 3d 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74   = 0; /* Indicat
1f2d0 65 20 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c  e VList may no l
1f2e0 6f 6e 67 65 72 20 62 65 20 65 6e 6c 61 72 67 65  onger be enlarge
1f2f0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  d */.        sql
1f300 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
1f310 28 76 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50 34  (v, (char*)z, P4
1f320 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
1f330 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  }.      return t
1f340 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
1f350 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1f360 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
1f370 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  n pExpr->iTable;
1f380 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1f390 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
1f3a0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
1f3b0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
1f3c0 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
1f3d0 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
1f3e0 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
1f3f0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
1f400 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1f410 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1f420 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
1f430 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
1f440 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
1f450 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f460 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
1f470 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
1f480 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
1f490 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
1f4a0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1f4b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f4c0 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c  OP_Cast, target,
1f4d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f4e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f4f0 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
1f500 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
1f510 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f520 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e  inReg;.    }.#en
1f530 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1f540 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63  IT_CAST */.    c
1f550 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1f560 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
1f570 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
1f580 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
1f590 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d  K_NE;.      p5 =
1f5a0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a   SQLITE_NULLEQ;.
1f5b0 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68        /* fall-th
1f5c0 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
1f5d0 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
1f5e0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
1f5f0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
1f600 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
1f610 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
1f620 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
1f630 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
1f640 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
1f650 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1f660 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74  prIsVector(pLeft
1f670 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) ){.        cod
1f680 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70  eVectorCompare(p
1f690 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1f6a0 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20  rget, op, p5);. 
1f6b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f6c0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f6d0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f6e0 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67  rse, pLeft, &reg
1f6f0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
1f700 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1f710 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f720 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1f730 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1f740 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1f750 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
1f760 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1f770 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31  ,.            r1
1f780 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c  , r2, inReg, SQL
1f790 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35  ITE_STOREP2 | p5
1f7a0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f7b0 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
1f7c0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f7d0 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
1f7e0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
1f7f0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f800 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
1f810 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f820 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
1f830 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
1f840 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f850 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
1f860 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f870 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
1f880 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
1f890 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f8a0 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
1f8b0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f8c0 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
1f8d0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
1f8e0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f8f0 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
1f900 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f910 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Eq); VdbeCovera
1f920 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71  geIf(v,op==OP_Eq
1f930 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f940 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
1f950 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f960 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ne); VdbeCovera
1f970 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65  geIf(v,op==OP_Ne
1f980 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f990 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f9a0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1f9b0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1f9c0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1f9d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f9e0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1f9f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1fa00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
1fa10 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
1fa20 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
1fa30 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
1fa40 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
1fa50 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
1fa60 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
1fa70 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
1fa80 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
1fa90 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
1faa0 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
1fab0 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
1fac0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1fad0 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
1fae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ;            tes
1faf0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e  tcase( op==TK_AN
1fb00 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
1fb10 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
1fb20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1fb30 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1fb40 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OR );.      ass
1fb50 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50  ert( TK_PLUS==OP
1fb60 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20 20  _Add );         
1fb70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fb80 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20  TK_PLUS );.     
1fb90 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55   assert( TK_MINU
1fba0 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29  S==OP_Subtract )
1fbb0 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;     testcase( 
1fbc0 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a  op==TK_MINUS );.
1fbd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1fbe0 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
1fbf0 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  er );      testc
1fc00 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20  ase( op==TK_REM 
1fc10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fc20 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42   TK_BITAND==OP_B
1fc30 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65  itAnd );      te
1fc40 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1fc50 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  ITAND );.      a
1fc60 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d  ssert( TK_BITOR=
1fc70 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20  =OP_BitOr );    
1fc80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1fc90 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20  ==TK_BITOR );.  
1fca0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
1fcb0 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
1fcc0 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61 73  );       testcas
1fcd0 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20  e( op==TK_SLASH 
1fce0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fcf0 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
1fd00 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65  hiftLeft );   te
1fd10 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1fd20 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
1fd30 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
1fd40 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
1fd50 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
1fd60 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20  ==TK_RSHIFT );. 
1fd70 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1fd80 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
1fd90 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  t );      testca
1fda0 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41  se( op==TK_CONCA
1fdb0 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1fdc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1fdd0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1fde0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1fdf0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1fe00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fe10 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1fe20 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1fe30 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
1fe40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1fe50 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
1fe60 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
1fe70 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1fe80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1fe90 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1fea0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1feb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1fec0 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
1fed0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1fee0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
1fef0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ff00 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
1ff10 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
1ff20 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
1ff30 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
1ff40 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c  Parse, pLeft, 1,
1ff50 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1ff60 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1ff70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ff80 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1ff90 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  INT.      }else 
1ffa0 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
1ffb0 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  K_FLOAT ){.     
1ffc0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1ffd0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ffe0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1fff0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52  );.        codeR
20000 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e  eal(v, pLeft->u.
20010 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65  zToken, 1, targe
20020 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
20030 72 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69  rn target;.#endi
20040 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
20050 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20         tempX.op 
20060 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20  = TK_INTEGER;.  
20070 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67        tempX.flag
20080 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c  s = EP_IntValue|
20090 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20  EP_TokenOnly;.  
200a0 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56        tempX.u.iV
200b0 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  alue = 0;.      
200c0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
200d0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
200e0 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46  e, &tempX, &regF
200f0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ree1);.        r
20100 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
20110 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
20120 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
20130 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
20140 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20150 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
20160 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
20170 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  et);.        tes
20180 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
20190 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
201a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
201b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
201c0 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
201d0 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
201e0 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
201f0 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20  =OP_BitNot );   
20200 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
20210 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20  _BITNOT );.     
20220 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d   assert( TK_NOT=
20230 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20  =OP_Not );      
20240 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20250 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_NOT );.     
20260 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
20270 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
20280 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
20290 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
202a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
202b0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
202c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
202d0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e  p2(v, op, r1, in
202e0 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
202f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
20300 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20  e TK_TRUTH: {.  
20310 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20      int isTrue; 
20320 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72     /* IS TRUE or
20330 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a   IS NOT TRUE */.
20340 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 72 6d 61        int bNorma
20350 6c 3b 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20  l;   /* IS TRUE 
20360 6f 72 20 49 53 20 46 41 4c 53 45 20 2a 2f 0a 20  or IS FALSE */. 
20370 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
20380 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
20390 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
203a0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
203b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
203c0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
203d0 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71       isTrue = sq
203e0 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
203f0 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  lue(pExpr->pRigh
20400 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72 6d 61  t);.      bNorma
20410 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d  l = pExpr->op2==
20420 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74 65 73  TK_IS;.      tes
20430 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
20440 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
20450 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72   testcase( !isTr
20460 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a  ue && bNormal);.
20470 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20480 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
20490 5f 49 73 54 72 75 65 2c 20 72 31 2c 20 69 6e 52  _IsTrue, r1, inR
204a0 65 67 2c 20 21 69 73 54 72 75 65 2c 20 69 73 54  eg, !isTrue, isT
204b0 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b 0a  rue ^ bNormal);.
204c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
204d0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
204e0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
204f0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
20500 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
20510 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
20520 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
20530 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
20540 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
20550 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
20560 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
20570 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
20580 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
20590 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
205a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
205b0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
205c0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31  arget);.      r1
205d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
205e0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
205f0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
20600 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
20610 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20620 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  1==0 );.      ad
20630 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
20640 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
20650 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
20660 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
20670 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
20680 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
20690 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
206a0 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
206b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
206c0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61  P_Integer, 0, ta
206d0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
206e0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
206f0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
20700 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20710 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
20720 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
20730 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
20740 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
20750 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
20760 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
20770 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
20780 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
20790 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
207a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
207b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
207c0 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
207d0 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78  gate: %s()", pEx
207e0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
207f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20800 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f      return pInfo
20810 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69  ->aFunc[pExpr->i
20820 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20  Agg].iMem;.     
20830 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
20840 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
20850 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
20860 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46      ExprList *pF
20870 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  arg;       /* Li
20880 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
20890 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
208a0 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20    int nFarg;    
208b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
208c0 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  er of function a
208d0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
208e0 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
208f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20900 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
20910 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
20920 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20930 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  zId;       /* Th
20940 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
20950 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e  */.      u32 con
20960 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  stMask = 0;     
20970 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74  /* Mask of funct
20980 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68  ion arguments th
20990 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20  at are constant 
209a0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209c0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
209d0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
209e0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
209f0 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  b;  /* The datab
20a00 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
20a10 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
20a20 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
20a30 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
20a40 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
20a50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
20a60 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
20a70 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
20a80 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
20a90 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  e */..#ifndef SQ
20aa0 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
20ab0 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45  FUNC.      if( E
20ac0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20ad0 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63  Expr, EP_WinFunc
20ae0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
20af0 75 72 6e 20 70 45 78 70 72 2d 3e 79 2e 70 57 69  urn pExpr->y.pWi
20b00 6e 2d 3e 72 65 67 52 65 73 75 6c 74 3b 0a 20 20  n->regResult;.  
20b10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
20b20 20 20 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63      if( ConstFac
20b30 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 26 26  torOk(pParse) &&
20b40 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
20b50 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45  nstantNotJoin(pE
20b60 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
20b70 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  /* SQL functions
20b80 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76   can be expensiv
20b90 65 2e 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76  e. So try to mov
20ba0 65 20 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74  e constant funct
20bb0 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ions.        ** 
20bc0 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
20bd0 20 6c 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20 74   loop, even if t
20be0 68 61 74 20 6d 65 61 6e 73 20 61 6e 20 65 78 74  hat means an ext
20bf0 72 61 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20  ra OP_Copy. */. 
20c00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
20c10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
20c20 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
20c30 72 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  r, -1);.      }.
20c40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
20c50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20c60 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
20c70 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
20c80 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
20c90 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
20ca0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
20cb0 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20   pFarg = 0;.    
20cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20cd0 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e   pFarg = pExpr->
20ce0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d  x.pList;.      }
20cf0 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70  .      nFarg = p
20d00 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45  Farg ? pFarg->nE
20d10 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61  xpr : 0;.      a
20d20 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
20d30 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
20d40 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
20d50 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72       zId = pExpr
20d60 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
20d70 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
20d80 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
20d90 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63   zId, nFarg, enc
20da0 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  , 0);.#ifdef SQL
20db0 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f  ITE_ENABLE_UNKNO
20dc0 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a  WN_SQL_FUNCTION.
20dd0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
20de0 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70  0 && pParse->exp
20df0 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lain ){.        
20e00 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
20e10 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  ndFunction(db, "
20e20 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c  unknown", nFarg,
20e30 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
20e40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
20e50 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44  f( pDef==0 || pD
20e60 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30  ef->xFinalize!=0
20e70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20e80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
20e90 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e  se, "unknown fun
20ea0 63 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49  ction: %s()", zI
20eb0 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
20ec0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
20ed0 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64    /* Attempt a d
20ee0 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61  irect implementa
20ef0 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
20f00 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20  t-in COALESCE() 
20f10 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e  and.      ** IFN
20f20 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  ULL() functions.
20f30 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e    This avoids un
20f40 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 75 61  necessary evalua
20f50 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tion of.      **
20f60 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20   arguments past 
20f70 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55  the first non-NU
20f80 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  LL argument..   
20f90 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
20fa0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20fb0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  & SQLITE_FUNC_CO
20fc0 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20  ALESCE ){.      
20fd0 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63    int endCoalesc
20fe0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
20ff0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
21000 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
21010 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20  ( nFarg>=2 );.  
21020 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21030 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
21040 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
21050 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21060 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61    for(i=1; i<nFa
21070 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
21080 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21090 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
210a0 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64  ull, target, end
210b0 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
210c0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
210d0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
210e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
210f0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
21100 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [i].pExpr, targe
21110 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
21120 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21130 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
21140 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
21150 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21160 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
21170 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66  The UNLIKELY() f
21180 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
21190 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  op.  The result 
211a0 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  is the value.   
211b0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
211c0 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
211d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
211e0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
211f0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e  & SQLITE_FUNC_UN
21200 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20  LIKELY ){.      
21210 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
21220 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  =1 );.        re
21230 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
21240 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
21250 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
21260 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
21270 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
21280 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
21290 20 20 2f 2a 20 54 68 65 20 41 46 46 49 4e 49 54    /* The AFFINIT
212a0 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 65 76 61  Y() function eva
212b0 6c 75 61 74 65 73 20 74 6f 20 61 20 73 74 72 69  luates to a stri
212c0 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
212d0 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74  s.      ** the t
212e0 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  ype affinity of 
212f0 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  the argument.  T
21300 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
21310 74 65 73 74 69 6e 67 20 6f 66 0a 20 20 20 20 20  testing of.     
21320 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 74   ** the SQLite t
21330 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20 20 20 20  ype logic..     
21340 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
21350 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
21360 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46 49  SQLITE_FUNC_AFFI
21370 4e 49 54 59 20 29 7b 0a 20 20 20 20 20 20 20 20  NITY ){.        
21380 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 66  const char *azAf
21390 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62 22 2c 20  f[] = { "blob", 
213a0 22 74 65 78 74 22 2c 20 22 6e 75 6d 65 72 69 63  "text", "numeric
213b0 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 22 72  ", "integer", "r
213c0 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20 20 20 20  eal" };.        
213d0 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20 20  char aff;.      
213e0 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d    assert( nFarg=
213f0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 66  =1 );.        af
21400 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
21410 66 66 69 6e 69 74 79 28 70 46 61 72 67 2d 3e 61  ffinity(pFarg->a
21420 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
21430 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
21440 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72  oadString(v, tar
21450 67 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  get, .          
21460 20 20 20 20 20 20 28 61 66 66 3c 3d 53 51 4c 49        (aff<=SQLI
21470 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 20 3f 20 22  TE_AFF_NONE) ? "
21480 6e 6f 6e 65 22 20 3a 20 61 7a 41 66 66 5b 61 66  none" : azAff[af
21490 66 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  f-SQLITE_AFF_BLO
214a0 42 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  B]);.        ret
214b0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
214c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
214d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61    for(i=0; i<nFa
214e0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
214f0 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71    if( i<32 && sq
21500 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
21510 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  ant(pFarg->a[i].
21520 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
21530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
21540 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
21550 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41   constMask |= MA
21560 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20  SKBIT32(i);.    
21570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21580 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
21590 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
215a0 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26  _NEEDCOLL)!=0 &&
215b0 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
215c0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
215d0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
215e0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
215f0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
21600 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21610 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
21620 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e  .        if( con
21630 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20  stMask ){.      
21640 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d      r1 = pParse-
21650 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
21660 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
21670 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20  += nFarg;.      
21680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21690 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
216a0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
216b0 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
216c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
216d0 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61  * For length() a
216e0 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  nd typeof() func
216f0 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c  tions with a col
21700 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20  umn argument,.  
21710 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65        ** set the
21720 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f   P5 parameter to
21730 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   the OP_Column o
21740 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f  pcode to OPFLAG_
21750 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20  LENGTHARG.      
21760 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54    ** or OPFLAG_T
21770 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74  YPEOFARG respect
21780 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20  ively, to avoid 
21790 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61  unnecessary data
217a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64  .        ** load
217b0 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
217c0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
217d0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
217e0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
217f0 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  TH|SQLITE_FUNC_T
21800 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20  YPEOF))!=0 ){.  
21810 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f          u8 exprO
21820 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
21830 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
21840 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
21850 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  t( pFarg->a[0].p
21860 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
21870 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46       exprOp = pF
21880 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
21890 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  >op;.          i
218a0 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f  f( exprOp==TK_CO
218b0 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d  LUMN || exprOp==
218c0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
218d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
218e0 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
218f0 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f  _LENGTH==OPFLAG_
21900 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
21910 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21920 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
21930 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45  EOF==OPFLAG_TYPE
21940 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  OFARG );.       
21950 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21960 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
21970 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
21980 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
21990 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
219a0 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20  pr->op2 = .     
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
219c0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
219d0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
219e0 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  |OPFLAG_TYPEOFAR
219f0 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  G);.          }.
21a00 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
21a10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
21a20 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
21a30 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 30 2c  e, pFarg, r1, 0,
21a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a60 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
21a70 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  |SQLITE_ECEL_FAC
21a80 54 4f 52 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  TOR);.      }els
21a90 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
21aa0 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
21ab0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
21ac0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
21ad0 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76    /* Possibly ov
21ae0 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74  erload the funct
21af0 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ion if the first
21b00 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20   argument is.   
21b10 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20     ** a virtual 
21b20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  table column..  
21b30 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21b40 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69  For infix functi
21b50 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c  ons (LIKE, GLOB,
21b60 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54   REGEXP, and MAT
21b70 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20  CH) use the.    
21b80 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75    ** second argu
21b90 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69  ment, not the fi
21ba0 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75  rst, as the argu
21bb0 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a  ment to test to.
21bc0 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
21bd0 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  it is a column i
21be0 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  n a virtual tabl
21bf0 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65  e.  This is done
21c00 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a   because.      *
21c10 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  * the left opera
21c20 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63  nd of infix func
21c30 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61  tions (the opera
21c40 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20  nd we want to.  
21c50 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f      ** control o
21c60 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73  verloading) ends
21c70 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e   up as the secon
21c80 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
21c90 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  e.      ** funct
21ca0 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73  ion.  The expres
21cb0 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  sion "A glob B" 
21cc0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
21cd0 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62   .      ** "glob
21ce0 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20  (B,A).  We want 
21cf0 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20  to use the A in 
21d00 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65  "A glob B" to te
21d10 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  st.      ** for 
21d20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61  function overloa
21d30 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73  ding.  But we us
21d40 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20  e the B term in 
21d50 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20  "glob(B,A)"..   
21d60 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
21d70 6e 46 61 72 67 3e 3d 32 20 26 26 20 45 78 70 72  nFarg>=2 && Expr
21d80 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
21d90 72 2c 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29  r, EP_InfixFunc)
21da0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
21db0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
21dc0 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
21dd0 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
21de0 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
21df0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
21e00 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
21e10 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
21e20 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
21e30 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
21e40 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
21e50 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
21e60 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
21e70 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
21e80 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
21e90 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
21ea0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
21eb0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
21ec0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
21ed0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21ee0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
21ef0 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
21f00 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
21f10 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
21f20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
21f30 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
21f40 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20  _SQL_FUNC.      
21f50 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
21f60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
21f70 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20 20 20  C_OFFSET ){.    
21f80 20 20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d      Expr *pArg =
21f90 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21fa0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
21fb0 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  pArg->op==TK_COL
21fc0 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
21fd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21fe0 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c  p3(v, OP_Offset,
21ff0 20 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70   pArg->iTable, p
22000 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  Arg->iColumn, ta
22010 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
22020 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22030 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22040 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
22050 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
22060 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a    }.      }else.
22070 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
22080 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22090 62 65 41 64 64 4f 70 34 28 76 2c 20 70 50 61 72  beAddOp4(v, pPar
220a0 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f  se->iSelfTab ? O
220b0 50 5f 50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50  P_PureFunc0 : OP
220c0 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20  _Function0,.    
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c        constMask,
220f0 20 72 31 2c 20 74 61 72 67 65 74 2c 20 28 63 68   r1, target, (ch
22100 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e  ar*)pDef, P4_FUN
22110 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73  CDEF);.        s
22120 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
22130 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
22140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22150 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e  if( nFarg && con
22160 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20  stMask==0 ){.   
22170 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
22180 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
22190 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
221a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
221b0 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
221c0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
221d0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
221e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
221f0 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
22200 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
22210 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
22220 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
22230 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
22240 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
22250 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
22260 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45     if( op==TK_SE
22270 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20  LECT && (nCol = 
22280 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
22290 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
222a0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
222b0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
222c0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f  rror(pParse, nCo
222d0 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 1);.      }el
222e0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
222f0 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  rn sqlite3CodeSu
22300 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
22310 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
22320 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22330 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
22340 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  ELECT_COLUMN: {.
22350 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
22360 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
22370 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  eft->iTable==0 )
22380 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
22390 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d  >pLeft->iTable =
223a0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
223b0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
223c0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
223d0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
223e0 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
223f0 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c  ==0 || pExpr->pL
22400 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  eft->op==TK_SELE
22410 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
22420 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 30  pExpr->iTable!=0
22430 0a 20 20 20 20 20 20 20 26 26 20 70 45 78 70 72  .       && pExpr
22440 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73  ->iTable!=(n = s
22450 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
22460 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  Size(pExpr->pLef
22470 74 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  t)).      ){.   
22480 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
22490 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
224a0 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65   columns assigne
224b0 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  d %d values",.  
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
224e0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b  xpr->iTable, n);
224f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
22500 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65  eturn pExpr->pLe
22510 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78  ft->iTable + pEx
22520 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
22530 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
22540 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
22550 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
22560 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
22570 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
22580 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
22590 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
225a0 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
225b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
225c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
225d0 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
225e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
225f0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
22600 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
22610 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
22620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22630 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
22640 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
22650 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
22660 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
22670 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
22680 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22690 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
226a0 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
226b0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
226c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
226d0 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
226e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
226f0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65  target;.    }.#e
22700 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
22710 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
22720 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
22730 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
22740 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
22750 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
22760 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
22770 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
22780 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
22790 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
227a0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
227b0 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
227c0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
227d0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
227e0 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
227f0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
22800 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
22810 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
22820 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
22830 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
22840 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
22850 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c  Expr, target, 0,
22860 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
22870 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
22880 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
22890 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
228a0 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65  LLATE: .    case
228b0 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
228c0 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
228d0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 67  ->pLeft;.      g
228e0 6f 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f  oto expr_code_do
228f0 6f 76 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30 34  over; /* 2018-04
22900 2d 32 38 3a 20 50 72 65 76 65 6e 74 20 64 65 65  -28: Prevent dee
22910 70 20 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53 53  p recursion. OSS
22920 46 75 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a  Fuzz. */.    }..
22930 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
22940 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
22950 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
22960 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
22970 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
22980 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
22990 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
229a0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
229b0 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
229c0 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
229d0 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
229e0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
229f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
22a00 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
22a10 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
22a20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
22a30 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
22a40 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
22a50 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
22a60 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
22a70 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
22a80 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
22a90 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
22aa0 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
22ab0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
22ac0 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
22ad0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
22ae0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
22af0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
22b00 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
22b10 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
22b20 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
22b30 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
22b40 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
22b50 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
22b60 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
22b70 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
22b80 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
22b90 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
22ba0 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
22bb0 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
22bc0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
22bd0 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
22be0 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
22bf0 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
22c00 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
22c10 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
22c20 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
22c30 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
22c40 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
22c50 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
22c60 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
22c70 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
22c80 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
22c90 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
22ca0 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
22cb0 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
22cc0 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
22cd0 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
22ce0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
22cf0 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
22d00 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
22d10 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
22d20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
22d30 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
22d40 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
22d50 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
22d60 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
22d70 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
22d80 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
22d90 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
22da0 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
22db0 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
22dc0 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
22dd0 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
22de0 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
22df0 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
22e00 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
22e10 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
22e20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
22e30 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
22e40 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
22e50 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
22e60 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
22e70 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
22e80 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20  b;.      int p1 
22e90 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
22ea0 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  * (pTab->nCol+1)
22eb0 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43   + 1 + pExpr->iC
22ec0 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73  olumn;..      as
22ed0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
22ee0 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
22ef0 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  >iTable==1 );.  
22f00 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
22f10 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26  r->iColumn>=-1 &
22f20 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
22f30 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
22f40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
22f50 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45  b->iPKey<0 || pE
22f60 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54  xpr->iColumn!=pT
22f70 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20  ab->iPKey );.   
22f80 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30     assert( p1>=0
22f90 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43   && p1<(pTab->nC
22fa0 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20  ol*2+2) );..    
22fb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22fc0 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c  Op2(v, OP_Param,
22fd0 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   p1, target);.  
22fe0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22ff0 28 76 2c 20 22 72 5b 25 64 5d 3d 25 73 2e 25 73  (v, "r[%d]=%s.%s
23000 22 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  ", target,.     
23010 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c     (pExpr->iTabl
23020 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64  e ? "new" : "old
23030 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  "),.        (pEx
23040 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20  pr->iColumn<0 ? 
23050 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d  "rowid" : pExpr-
23060 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  >y.pTab->aCol[pE
23070 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e  xpr->iColumn].zN
23080 61 6d 65 29 0a 20 20 20 20 20 20 29 29 3b 0a 0a  ame).      ));..
23090 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
230a0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
230b0 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  NT.      /* If t
230c0 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45  he column has RE
230d0 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20  AL affinity, it 
230e0 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
230f0 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20   stored as an.  
23100 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
23110 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  Use OP_RealAffin
23120 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ity to make sure
23130 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
23140 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  al..      **.   
23150 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
23160 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32  F: R-60985-57662
23170 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e   SQLite will con
23180 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62  vert the value b
23190 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ack to.      ** 
231a0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77  floating point w
231b0 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69  hen extracting i
231c0 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72  t from the recor
231d0 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
231e0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
231f0 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54  =0 .       && pT
23200 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
23210 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
23220 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
23230 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  AL.      ){.    
23240 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23250 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
23260 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74  Affinity, target
23270 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
23280 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
23290 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
232a0 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20  K_VECTOR: {.    
232b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
232c0 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
232d0 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
232e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
232f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 4b 5f 49 46   }..    /* TK_IF
23300 5f 4e 55 4c 4c 5f 52 4f 57 20 45 78 70 72 20 6e  _NULL_ROW Expr n
23310 6f 64 65 73 20 61 72 65 20 69 6e 73 65 72 74 65  odes are inserte
23320 64 20 61 68 65 61 64 20 6f 66 20 65 78 70 72 65  d ahead of expre
23330 73 73 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 74 68  ssions.    ** th
23340 61 74 20 64 65 72 69 76 65 20 66 72 6f 6d 20 74  at derive from t
23350 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61  he right-hand ta
23360 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
23370 49 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  IN.  The.    ** 
23380 45 78 70 72 2e 69 54 61 62 6c 65 20 76 61 6c 75  Expr.iTable valu
23390 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  e is the table n
233a0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 69  umber for the ri
233b0 67 68 74 2d 68 61 6e 64 20 74 61 62 6c 65 2e 0a  ght-hand table..
233c0 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65      ** The expre
233d0 73 73 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76  ssion is only ev
233e0 61 6c 75 61 74 65 64 20 69 66 20 74 68 61 74 20  aluated if that 
233f0 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 63 75 72  table is not cur
23400 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6f 6e  rently.    ** on
23410 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 4e 55 4c   a LEFT JOIN NUL
23420 4c 20 72 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  L row..    */.  
23430 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c    case TK_IF_NUL
23440 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69  L_ROW: {.      i
23450 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20  nt addrINR;.    
23460 20 20 75 38 20 6f 6b 43 6f 6e 73 74 46 61 63 74    u8 okConstFact
23470 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6f 6b 43  or = pParse->okC
23480 6f 6e 73 74 46 61 63 74 6f 72 3b 0a 20 20 20 20  onstFactor;.    
23490 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69    addrINR = sqli
234a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
234b0 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70   OP_IfNullRow, p
234c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
234d0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
234e0 69 6c 79 20 64 69 73 61 62 6c 65 20 66 61 63 74  ily disable fact
234f0 6f 72 69 6e 67 20 6f 66 20 63 6f 6e 73 74 61 6e  oring of constan
23500 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  t expressions, s
23510 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  ince.      ** ev
23520 65 6e 20 74 68 6f 75 67 68 20 65 78 70 72 65 73  en though expres
23530 73 69 6f 6e 73 20 6d 61 79 20 61 70 70 65 61 72  sions may appear
23540 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 2c   to be constant,
23550 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20   they are not.  
23560 20 20 20 20 2a 2a 20 72 65 61 6c 6c 79 20 63 6f      ** really co
23570 6e 73 74 61 6e 74 20 62 65 63 61 75 73 65 20 74  nstant because t
23580 68 65 79 20 6f 72 69 67 69 6e 61 74 65 20 66 72  hey originate fr
23590 6f 6d 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  om the right-han
235a0 64 20 73 69 64 65 0a 20 20 20 20 20 20 2a 2a 20  d side.      ** 
235b0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
235c0 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  */.      pParse-
235d0 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d  >okConstFactor =
235e0 20 30 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20   0;.      inReg 
235f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
23600 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
23610 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
23620 72 67 65 74 29 3b 0a 20 20 20 20 20 20 70 50 61  rget);.      pPa
23630 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
23640 6f 72 20 3d 20 6f 6b 43 6f 6e 73 74 46 61 63 74  or = okConstFact
23650 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
23660 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
23670 20 61 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20   addrINR);.     
23680 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
23690 67 65 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c  geP3(v, addrINR,
236a0 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62   inReg);.      b
236b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
236c0 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
236d0 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
236e0 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
236f0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
23700 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
23710 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
23720 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
23730 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
23740 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
23750 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
23760 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
23770 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
23780 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
23790 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
237a0 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
237b0 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
237c0 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
237d0 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
237e0 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
237f0 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
23800 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
23810 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
23820 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
23830 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
23840 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
23850 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
23860 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
23870 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61  * Y is in the la
23880 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45  st element of pE
23890 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20  xpr->x.pList if 
238a0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
238b0 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20  nExpr is.    ** 
238c0 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61  odd.  The Y is a
238d0 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49  lso optional.  I
238e0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
238f0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c  elements in x.pL
23900 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76  ist.    ** is ev
23910 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d  en, then Y is om
23920 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f  itted and the "o
23930 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74  therwise" result
23940 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
23950 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
23960 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
23970 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
23980 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
23990 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
239a0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
239b0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
239c0 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
239d0 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
239e0 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
239f0 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
23a00 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
23a10 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
23a20 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
23a30 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
23a40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
23a50 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70  ault: assert( op
23a60 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20  ==TK_CASE ); {. 
23a70 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
23a80 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
23a90 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
23aa0 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
23ab0 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
23ac0 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ae0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
23af0 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
23b00 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
23b10 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
23b40 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
23b50 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
23b80 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
23b90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
23ba0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
23bb0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
23bc0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
23bd0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
23be0 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
23bf0 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
23c00 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
23c10 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
23c20 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
23c30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
23c40 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
23c50 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
23c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23c80 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
23c90 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
23ca0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
23cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
23cc0 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
23cd0 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
23ce0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  /.      Expr *pD
23cf0 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  el = 0;.      sq
23d00 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
23d10 73 65 2d 3e 64 62 3b 0a 0a 20 20 20 20 20 20 61  se->db;..      a
23d20 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
23d30 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
23d40 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20  P_xIsSelect) && 
23d50 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
23d60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
23d70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
23d80 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
23d90 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
23da0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
23db0 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
23dc0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
23dd0 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
23de0 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
23df0 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
23e00 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
23e10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  );.      if( (pX
23e20 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29   = pExpr->pLeft)
23e30 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
23e40 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Del = sqlite3Exp
23e50 72 44 75 70 28 64 62 2c 20 70 58 2c 20 30 29 3b  rDup(db, pX, 0);
23e60 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
23e70 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
23e80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23e90 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
23ea0 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20   pDel);.        
23eb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
23ec0 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
23ed0 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
23ee0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
23ef0 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
23f00 28 70 44 65 6c 2c 20 65 78 70 72 43 6f 64 65 56  (pDel, exprCodeV
23f10 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 44  ector(pParse, pD
23f20 65 6c 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  el, &regFree1));
23f30 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
23f40 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
23f50 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
23f60 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c 20  (&opCompare, 0, 
23f70 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72 65  sizeof(opCompare
23f80 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  ));.        opCo
23f90 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51  mpare.op = TK_EQ
23fa0 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
23fb0 61 72 65 2e 70 4c 65 66 74 20 3d 20 70 44 65 6c  are.pLeft = pDel
23fc0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20  ;.        pTest 
23fd0 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20  = &opCompare;.  
23fe0 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
23ff0 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31 37  b351d95f9cd5ef17
24000 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38 36  e9d9dbae18f5ca86
24010 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20  11190001:.      
24020 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69    ** The value i
24030 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68 74  n regFree1 might
24040 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e   get SCopy-ed in
24050 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73 75  to the file resu
24060 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  lt..        ** S
24070 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
24080 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72 65   the regFree1 re
24090 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65  gister is not re
240a0 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20  used for other. 
240b0 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73         ** purpos
240c0 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  es and possibly 
240d0 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
240e0 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65  .        regFree
240f0 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  1 = 0;.      }. 
24100 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
24110 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b  nExpr-1; i=i+2){
24120 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20  .        if( pX 
24130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
24140 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b  ert( pTest!=0 );
24150 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  .          opCom
24160 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c  pare.pRight = aL
24170 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
24180 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
24190 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74  .          pTest
241a0 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e   = aListelem[i].
241b0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  pExpr;.        }
241c0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73  .        nextCas
241d0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
241e0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
241f0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
24200 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54  se( pTest->op==T
24210 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
24220 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
24230 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
24240 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20  Test, nextCase, 
24250 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
24260 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  L);.        test
24270 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b  case( aListelem[
24280 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  i+1].pExpr->op==
24290 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
242a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
242b0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
242c0 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
242d0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
242e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
242f0 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  oto(v, endLabel)
24300 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24310 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
24320 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
24330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24340 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29  ( (nExpr&1)!=0 )
24350 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24360 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
24370 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70  , pEList->a[nExp
24380 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  r-1].pExpr, targ
24390 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  et);.      }else
243a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
243b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
243c0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
243d0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
243e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
243f0 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
24400 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24410 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
24420 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
24430 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
24440 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24450 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
24460 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
24470 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
24480 70 72 2d 3e 61 66 66 45 78 70 72 3d 3d 4f 45 5f  pr->affExpr==OE_
24490 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20  Rollback .      
244a0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
244b0 66 66 45 78 70 72 3d 3d 4f 45 5f 41 62 6f 72 74  ffExpr==OE_Abort
244c0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
244d0 45 78 70 72 2d 3e 61 66 66 45 78 70 72 3d 3d 4f  Expr->affExpr==O
244e0 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20  E_Fail.         
244f0 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 45    || pExpr->affE
24500 78 70 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20  xpr==OE_Ignore. 
24510 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
24520 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67  ( !pParse->pTrig
24530 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20  gerTab ){.      
24540 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24550 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24570 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
24580 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
24590 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
245a0 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ram");.        r
245b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
245c0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
245d0 2d 3e 61 66 66 45 78 70 72 3d 3d 4f 45 5f 41 62  ->affExpr==OE_Ab
245e0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
245f0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
24600 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
24610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
24620 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
24630 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
24640 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e) );.      if( 
24650 70 45 78 70 72 2d 3e 61 66 66 45 78 70 72 3d 3d  pExpr->affExpr==
24660 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
24670 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24680 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
24690 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20      v, OP_Halt, 
246a0 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67  SQLITE_OK, OE_Ig
246b0 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e  nore, 0, pExpr->
246c0 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20  u.zToken,0);.   
246d0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
246e0 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
246f0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
24700 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
24710 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
24720 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
24730 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
24740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24750 20 20 70 45 78 70 72 2d 3e 61 66 66 45 78 70 72    pExpr->affExpr
24760 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
24770 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
24780 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
24790 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
247a0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
247b0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
247c0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
247d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
247e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
247f0 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
24800 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
24810 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63  Factor out the c
24820 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ode of the given
24830 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69   expression to i
24840 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
24850 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  me..**.** If reg
24860 44 65 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65  Dest>=0 then the
24870 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79   result is alway
24880 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74  s stored in that
24890 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 74 68   register and th
248a0 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e  e.** result is n
248b0 6f 74 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66  ot reusable.  If
248c0 20 72 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20   regDest<0 then 
248d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
248e0 66 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72  free to .** stor
248f0 65 20 74 68 65 20 76 61 6c 75 65 20 77 68 65 72  e the value wher
24900 65 65 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20  eever it wants. 
24910 20 54 68 65 20 72 65 67 69 73 74 65 72 20 77 68   The register wh
24920 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ere the expressi
24930 6f 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  on .** is stored
24940 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57   is returned.  W
24950 68 65 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74  hen regDest<0, t
24960 77 6f 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70  wo identical exp
24970 72 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a  ressions will.**
24980 20 63 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d   code to the sam
24990 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  e register..*/.i
249a0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
249b0 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73  deAtInit(.  Pars
249c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
249d0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
249e0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
249f0 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  r,      /* The e
24a00 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64  xpression to cod
24a10 65 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20  e when the VDBE 
24a20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20  initializes */. 
24a30 20 69 6e 74 20 72 65 67 44 65 73 74 20 20 20 20   int regDest    
24a40 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
24a50 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
24a60 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
24a70 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73  xprList *p;.  as
24a80 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f  sert( ConstFacto
24a90 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20  rOk(pParse) );. 
24aa0 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f   p = pParse->pCo
24ab0 6e 73 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72  nstExpr;.  if( r
24ac0 65 67 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b  egDest<0 && p ){
24ad0 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
24ae0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
24af0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
24b00 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c   for(pItem=p->a,
24b10 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30   i=p->nExpr; i>0
24b20 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b  ; pItem++, i--){
24b30 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
24b40 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71  ->reusable && sq
24b50 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
24b60 28 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  (0,pItem->pExpr,
24b70 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a  pExpr,-1)==0 ){.
24b80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
24b90 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78  Item->u.iConstEx
24ba0 70 72 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20  prReg;.      }. 
24bb0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72     }.  }.  pExpr
24bc0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
24bd0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
24be0 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73  xpr, 0);.  p = s
24bf0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
24c00 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20  pend(pParse, p, 
24c10 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20  pExpr);.  if( p 
24c20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20 45  ){.     struct E
24c30 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
24c40 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
24c50 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49  Expr-1];.     pI
24c60 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20  tem->reusable = 
24c70 72 65 67 44 65 73 74 3c 30 3b 0a 20 20 20 20 20  regDest<0;.     
24c80 69 66 28 20 72 65 67 44 65 73 74 3c 30 20 29 20  if( regDest<0 ) 
24c90 72 65 67 44 65 73 74 20 3d 20 2b 2b 70 50 61 72  regDest = ++pPar
24ca0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70  se->nMem;.     p
24cb0 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78  Item->u.iConstEx
24cc0 70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b  prReg = regDest;
24cd0 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70  .  }.  pParse->p
24ce0 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 20  ConstExpr = p;. 
24cf0 20 72 65 74 75 72 6e 20 72 65 67 44 65 73 74 3b   return regDest;
24d00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
24d10 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
24d20 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
24d30 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  n and store the 
24d40 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
24d50 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74  a register.  Ret
24d60 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
24d70 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68   number where th
24d80 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65  e results.** are
24d90 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   stored..**.** I
24da0 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  f the register i
24db0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  s a temporary re
24dc0 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20  gister that can 
24dd0 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a  be deallocated,.
24de0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74  ** then write it
24df0 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  s number into *p
24e00 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73  Reg.  If the res
24e10 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
24e20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  not.** a tempora
24e30 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ry, then set *pR
24e40 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  eg to zero..**.*
24e50 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
24e60 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
24e70 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
24e80 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a  t generate this.
24e90 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20  ** code to fill 
24ea0 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20  the register in 
24eb0 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
24ec0 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  on section of th
24ed0 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61  e.** VDBE progra
24ee0 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  m, in order to f
24ef0 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20  actor it out of 
24f00 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c  the evaluation l
24f10 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oop..*/.int sqli
24f20 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
24f30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
24f40 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
24f50 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32  *pReg){.  int r2
24f60 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
24f70 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
24f80 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70 45 78 70  teAndLikely(pExp
24f90 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46  r);.  if( ConstF
24fa0 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a  actorOk(pParse).
24fb0 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21     && pExpr->op!
24fc0 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20  =TK_REGISTER.   
24fd0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
24fe0 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
24ff0 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20  pExpr).  ){.    
25000 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20  *pReg  = 0;.    
25010 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
25020 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
25030 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20  e, pExpr, -1);. 
25040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
25050 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
25060 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
25070 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
25080 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
25090 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
250a0 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72  );.    if( r2==r
250b0 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67  1 ){.      *pReg
250c0 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = r1;.    }else
250d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
250e0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
250f0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
25100 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20   *pReg = 0;.    
25110 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
25120 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
25130 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
25140 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
25150 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
25160 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
25170 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
25180 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
25190 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
251a0 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
251b0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
251c0 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  target..*/.void 
251d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
251e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
251f0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
25200 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
25210 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
25220 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
25230 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
25240 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  m );.  if( pExpr
25250 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   && pExpr->op==T
25260 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
25270 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25280 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
25290 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70  e, OP_Copy, pExp
252a0 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
252b0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
252c0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
252d0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
252e0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
252f0 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72  rget);.    asser
25300 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
25310 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
25320 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
25330 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67  );.    if( inReg
25340 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72  !=target && pPar
25350 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
25360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25370 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
25380 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  be, OP_SCopy, in
25390 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
253a0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
253b0 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e   Make a transien
253c0 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  t copy of expres
253d0 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74  sion pExpr and t
253e0 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e  hen code it usin
253f0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72  g.** sqlite3Expr
25400 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f  Code().  This ro
25410 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74  utine works just
25420 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
25430 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70  rCode().** excep
25440 74 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74  t that the input
25450 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67   expression is g
25460 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
25470 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
25480 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
25490 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50  deCopy(Parse *pP
254a0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
254b0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
254c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
254d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45  pParse->db;.  pE
254e0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
254f0 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
25500 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  0);.  if( !db->m
25510 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71  allocFailed ) sq
25520 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
25530 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
25540 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  get);.  sqlite3E
25550 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
25560 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  xpr);.}../*.** G
25570 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
25580 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
25590 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
255a0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
255b0 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
255c0 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
255d0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
255e0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
255f0 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
25600 65 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74  er target.  If t
25610 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
25620 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
25630 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
25640 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20  might choose to 
25650 63 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73  code the express
25660 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a  ion at initializ
25670 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76  ation time..*/.v
25680 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
25690 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61  odeFactorable(Pa
256a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
256b0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
256c0 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61  rget){.  if( pPa
256d0 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
256e0 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  or && sqlite3Exp
256f0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
25700 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  in(pExpr) ){.   
25710 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25720 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
25730 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
25740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
25750 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
25760 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
25770 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
25780 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
25790 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 68  hat evaluates th
257a0 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
257b0 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20  on and puts the 
257c0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67  result.** in reg
257d0 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a  ister target..**
257e0 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20  .** Also make a 
257f0 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
25800 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  ession results i
25810 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63  nto another "cac
25820 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  he" register.** 
25830 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65  and modify the e
25840 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61  xpression so tha
25850 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  t the next time 
25860 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c  it is evaluated,
25870 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
25880 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
25890 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a  cache register..
258a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
258b0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  ne is used for e
258c0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
258d0 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c  are used multipl
258e0 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68  e .** times.  Th
258f0 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ey are evaluated
25900 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65   once and the re
25910 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70  sults of the exp
25920 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72  ression.** are r
25930 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  eused..*/.void s
25940 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e  qlite3ExprCodeAn
25950 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  dCache(Parse *pP
25960 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
25970 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
25980 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
25990 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
259a0 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74   iMem;..  assert
259b0 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
259c0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
259d0 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p!=TK_REGISTER )
259e0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
259f0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
25a00 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d  r, target);.  iM
25a10 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
25a20 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
25a30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
25a40 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65  opy, target, iMe
25a50 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69  m);.  exprToRegi
25a60 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d  ster(pExpr, iMem
25a70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
25a80 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
25a90 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
25aa0 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
25ab0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
25ac0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
25ad0 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
25ae0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
25af0 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
25b00 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
25b10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
25b20 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
25b30 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
25b40 74 75 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a 20 75  turned will.** u
25b50 73 75 61 6c 6c 79 20 62 65 20 70 4c 69 73 74 2d  sually be pList-
25b60 3e 6e 45 78 70 72 20 62 75 74 20 6d 69 67 68 74  >nExpr but might
25b70 20 62 65 20 72 65 64 75 63 65 64 20 69 66 20 53   be reduced if S
25b80 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52  QLITE_ECEL_OMITR
25b90 45 46 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  EF.** is defined
25ba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
25bb0 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67  TE_ECEL_DUP flag
25bc0 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61 72   prevents the ar
25bd0 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69  guments from bei
25be0 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69  ng.** filled usi
25bf0 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50  ng OP_SCopy.  OP
25c00 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73  _Copy must be us
25c10 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
25c20 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
25c30 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e  L_FACTOR argumen
25c40 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e  t allows constan
25c50 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62  t arguments to b
25c60 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75  e.** factored ou
25c70 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a  t into initializ
25c80 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ation code..**.*
25c90 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
25ca0 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73  L_REF flag means
25cb0 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
25cc0 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69  s in the list wi
25cd0 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61  th.** ExprList.a
25ce0 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  [].u.x.iOrderByC
25cf0 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64  ol>0 have alread
25d00 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64  y been evaluated
25d10 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69   and stored.** i
25d20 6e 20 72 65 67 69 73 74 65 72 73 20 61 74 20 73  n registers at s
25d30 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68  rcReg, and so th
25d40 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63  e value can be c
25d50 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65  opied from there
25d60 2e 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45  ..** If SQLITE_E
25d70 43 45 4c 5f 4f 4d 49 54 52 45 46 20 69 73 20 61  CEL_OMITREF is a
25d80 6c 73 6f 20 73 65 74 2c 20 74 68 65 6e 20 74 68  lso set, then th
25d90 65 20 76 61 6c 75 65 73 20 77 69 74 68 20 75 2e  e values with u.
25da0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a  x.iOrderByCol>0.
25db0 2a 2a 20 61 72 65 20 73 69 6d 70 6c 79 20 6f 6d  ** are simply om
25dc0 69 74 74 65 64 20 72 61 74 68 65 72 20 74 68 61  itted rather tha
25dd0 6e 20 62 65 69 6e 67 20 63 6f 70 69 65 64 20 66  n being copied f
25de0 72 6f 6d 20 73 72 63 52 65 67 2e 0a 2a 2f 0a 69  rom srcReg..*/.i
25df0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
25e00 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  deExprList(.  Pa
25e10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
25e20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
25e30 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
25e40 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54  t *pList,   /* T
25e50 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
25e60 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  st to be coded *
25e70 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20  /.  int target, 
25e80 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
25e90 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
25ea0 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67   */.  int srcReg
25eb0 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72  ,        /* Sour
25ec0 63 65 20 72 65 67 69 73 74 65 72 73 20 69 66 20  ce registers if 
25ed0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20  SQLITE_ECEL_REF 
25ee0 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20  */.  u8 flags   
25ef0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
25f00 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a  E_ECEL_* flags *
25f10 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  /.){.  struct Ex
25f20 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
25f30 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  em;.  int i, j, 
25f40 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d  n;.  u8 copyOp =
25f50 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25f60 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f  _ECEL_DUP) ? OP_
25f70 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b  Copy : OP_SCopy;
25f80 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
25f90 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
25fa0 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
25fb0 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ;.  assert( targ
25fc0 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  et>0 );.  assert
25fd0 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
25fe0 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20  =0 );  /* Never 
25ff0 67 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74  gets this far ot
26000 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d  herwise */.  n =
26010 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
26020 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f   if( !ConstFacto
26030 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c  rOk(pParse) ) fl
26040 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45  ags &= ~SQLITE_E
26050 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f  CEL_FACTOR;.  fo
26060 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
26070 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c  , i=0; i<n; i++,
26080 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45   pItem++){.    E
26090 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74  xpr *pExpr = pIt
260a0 65 6d 2d 3e 70 45 78 70 72 3b 0a 23 69 66 64 65  em->pExpr;.#ifde
260b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
260c0 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
260d0 53 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  S.    if( pItem-
260e0 3e 62 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20  >bSorterRef ){. 
260f0 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20       i--;.      
26100 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  n--;.    }else.#
26110 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 66  endif.    if( (f
26120 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
26130 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a  EL_REF)!=0 && (j
26140 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
26150 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a  rderByCol)>0 ){.
26160 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
26170 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d  & SQLITE_ECEL_OM
26180 49 54 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20  ITREF ){.       
26190 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d   i--;.        n-
261a0 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
261b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
261c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
261d0 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c  yOp, j+srcReg-1,
261e0 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
261f0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
26200 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
26210 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d  E_ECEL_FACTOR)!=
26220 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
26230 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
26240 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78  stantNotJoin(pEx
26250 70 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  pr).    ){.     
26260 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
26270 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
26280 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
26290 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
262a0 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71    int inReg = sq
262b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
262c0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
262d0 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
262e0 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
262f0 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20  arget+i ){.     
26300 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
26310 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79          if( copy
26320 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  Op==OP_Copy.    
26330 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c       && (pOp=sql
26340 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
26350 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f   -1))->opcode==O
26360 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20  P_Copy.         
26370 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  && pOp->p1+pOp->
26380 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20  p3+1==inReg.    
26390 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b       && pOp->p2+
263a0 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65  pOp->p3+1==targe
263b0 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  t+i.        ){. 
263c0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33           pOp->p3
263d0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
263e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
263f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
26400 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c  , copyOp, inReg,
26410 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
26420 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
26430 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
26440 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
26450 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
26460 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
26470 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45  r..**.**    x BE
26480 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a  TWEEN y AND z.**
26490 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
264a0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
264b0 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e  **.**    x>=y AN
264c0 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64  D x<=z.**.** Cod
264d0 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
264e0 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
264f0 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
26500 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d  pression.** elim
26510 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a  ination of x..**
26520 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20  .** The xJumpIf 
26530 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
26540 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a  ines details:.**
26550 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20  .**    NULL:    
26560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
26570 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e  tore the boolean
26580 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64   result in reg[d
26590 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74  est].**    sqlit
265a0 65 33 45 78 70 72 49 66 54 72 75 65 3a 20 20 20  e3ExprIfTrue:   
265b0 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20     Jump to dest 
265c0 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71  if true.**    sq
265d0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
265e0 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65  :     Jump to de
265f0 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a  st if false.**.*
26600 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  * The jumpIfNull
26610 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67   parameter is ig
26620 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66  nored if xJumpIf
26630 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61   is NULL..*/.sta
26640 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64  tic void exprCod
26650 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73  eBetween(.  Pars
26660 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
26670 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
26680 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
26690 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
266a0 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
266b0 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65  he BETWEEN expre
266c0 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
266d0 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
266e0 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  Jump destination
266f0 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61   or storage loca
26700 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28  tion */.  void (
26710 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45  *xJump)(Parse*,E
26720 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f  xpr*,int,int), /
26730 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65  * Action to take
26740 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
26750 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20  Null    /* Take 
26760 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
26770 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20  BETWEEN is NULL 
26780 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70  */.){.  Expr exp
26790 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65  rAnd;     /* The
267a0 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e   AND operator in
267b0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20    x>=y AND x<=z 
267c0 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c   */.  Expr compL
267d0 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20  eft;    /* The  
267e0 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x>=y  term */.  
267f0 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20  Expr compRight; 
26800 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20    /* The  x<=z  
26810 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65  term */.  int re
26820 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54  gFree1 = 0; /* T
26830 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
26840 69 73 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  ister */.  Expr 
26850 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  *pDel = 0;.  sql
26860 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
26870 65 2d 3e 64 62 3b 0a 0a 20 20 6d 65 6d 73 65 74  e->db;..  memset
26880 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73  (&compLeft, 0, s
26890 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
268a0 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67 68  memset(&compRigh
268b0 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  t, 0, sizeof(Exp
268c0 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65  r));.  memset(&e
268d0 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f  xprAnd, 0, sizeo
268e0 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73 73  f(Expr));..  ass
268f0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
26900 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
26910 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
26920 70 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  pDel = sqlite3Ex
26930 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d  prDup(db, pExpr-
26940 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 69 66  >pLeft, 0);.  if
26950 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
26960 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 70  ed==0 ){.    exp
26970 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
26980 3b 0a 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c  ;.    exprAnd.pL
26990 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b  eft = &compLeft;
269a0 0a 20 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69  .    exprAnd.pRi
269b0 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
269c0 3b 0a 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f  ;.    compLeft.o
269d0 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 63  p = TK_GE;.    c
269e0 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
269f0 70 44 65 6c 3b 0a 20 20 20 20 63 6f 6d 70 4c 65  pDel;.    compLe
26a00 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
26a10 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
26a20 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6d 70  .pExpr;.    comp
26a30 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45  Right.op = TK_LE
26a40 3b 0a 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e  ;.    compRight.
26a50 70 4c 65 66 74 20 3d 20 70 44 65 6c 3b 0a 20 20  pLeft = pDel;.  
26a60 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
26a70 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
26a80 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
26a90 0a 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73  .    exprToRegis
26aa0 74 65 72 28 70 44 65 6c 2c 20 65 78 70 72 43 6f  ter(pDel, exprCo
26ab0 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  deVector(pParse,
26ac0 20 70 44 65 6c 2c 20 26 72 65 67 46 72 65 65 31   pDel, &regFree1
26ad0 29 29 3b 0a 20 20 20 20 69 66 28 20 78 4a 75 6d  ));.    if( xJum
26ae0 70 20 29 7b 0a 20 20 20 20 20 20 78 4a 75 6d 70  p ){.      xJump
26af0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
26b00 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
26b10 75 6c 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ull);.    }else{
26b20 0a 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74  .      /* Mark t
26b30 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
26b40 20 62 65 69 6e 67 20 66 72 6f 6d 20 74 68 65 20   being from the 
26b50 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
26b60 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20  se of a join.   
26b70 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68     ** so that th
26b80 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
26b90 65 54 61 72 67 65 74 28 29 20 72 6f 75 74 69 6e  eTarget() routin
26ba0 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
26bb0 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20 20  pt to move.     
26bc0 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20   ** it into the 
26bd0 50 61 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72  Parse.pConstExpr
26be0 20 6c 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c   list.  We shoul
26bf0 64 20 75 73 65 20 61 20 6e 65 77 20 62 69 74 20  d use a new bit 
26c00 66 6f 72 20 74 68 69 73 2c 0a 20 20 20 20 20 20  for this,.      
26c10 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20  ** for clarity, 
26c20 62 75 74 20 77 65 20 61 72 65 20 6f 75 74 20 6f  but we are out o
26c30 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 45 78  f bits in the Ex
26c40 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 73  pr.flags field s
26c50 6f 20 77 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  o we.      ** ha
26c60 76 65 20 74 6f 20 72 65 75 73 65 20 74 68 65 20  ve to reuse the 
26c70 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e  EP_FromJoin bit.
26c80 20 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20    Bummer. */.   
26c90 20 20 20 70 44 65 6c 2d 3e 66 6c 61 67 73 20 7c     pDel->flags |
26ca0 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20  = EP_FromJoin;. 
26cb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26cc0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
26cd0 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
26ce0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
26cf0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
26d00 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
26d10 72 65 65 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ree1);.  }.  sql
26d20 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
26d30 62 2c 20 70 44 65 6c 29 3b 0a 0a 20 20 2f 2a 20  b, pDel);..  /* 
26d40 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20  Ensure adequate 
26d50 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f  test coverage */
26d60 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26d70 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26d80 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
26d90 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
26da0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
26db0 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26dc0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
26dd0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
26de0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
26df0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
26e00 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
26e10 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
26e20 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
26e30 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
26e40 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26e50 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26e60 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21    && jumpIfNull!
26e70 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
26e80 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26e90 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26ea0 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
26eb0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
26ec0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26ed0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26ee0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
26ef0 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
26f00 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
26f10 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
26f20 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
26f30 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
26f40 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
26f50 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26f60 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26f70 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26f80 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
26f90 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
26fa0 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
26fb0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b  ase( xJump==0 );
26fc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
26fd0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
26fe0 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
26ff0 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
27000 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
27010 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
27020 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
27030 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
27040 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
27050 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
27060 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
27070 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
27080 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
27090 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
270a0 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
270b0 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
270c0 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
270d0 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
270e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
270f0 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
27100 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FNULL..**.** Thi
27110 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
27120 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
27130 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
27140 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
27150 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
27160 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
27170 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
27180 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
27190 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
271a0 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
271b0 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
271c0 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
271d0 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
271e0 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
271f0 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
27200 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
27210 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
27220 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
27230 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
27240 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
27250 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
27260 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
27270 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
27280 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
27290 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
272a0 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
272b0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
272c0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
272d0 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
272e0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
272f0 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
27300 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
27310 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
27320 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
27330 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
27340 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
27350 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
27360 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65  R(v==0) )     re
27370 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65  turn;  /* Existe
27380 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
27390 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
273a0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
273b0 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  pr==0) ) return;
273c0 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73    /* No way this
273d0 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20   can happen */. 
273e0 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
273f0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
27400 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
27410 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
27420 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
27430 70 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pAlt = sqlite3Ex
27440 70 72 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f  prSimplifiedAndO
27450 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  r(pExpr);.      
27460 69 66 28 20 70 41 6c 74 21 3d 70 45 78 70 72 20  if( pAlt!=pExpr 
27470 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27480 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
27490 72 73 65 2c 20 70 41 6c 74 2c 20 64 65 73 74 2c  rse, pAlt, dest,
274a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
274b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
274c0 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
274d0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
274e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
274f0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
27500 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
27510 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
27520 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27530 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
27540 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
27550 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
27560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 75                ju
27570 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
27580 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
27590 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
275a0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
275b0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
275c0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
275d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
275e0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
275f0 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 7d  (v, d2);.      }
27600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
27610 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27620 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ll==0 );.       
27630 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
27640 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
27650 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
27660 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
27670 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
27680 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
27690 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
276a0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
276b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
276c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
276d0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
276e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
276f0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
27700 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27710 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
27720 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
27730 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
27740 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27750 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27760 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69  TRUTH: {.      i
27770 6e 74 20 69 73 4e 6f 74 3b 20 20 20 20 20 20 2f  nt isNot;      /
27780 2a 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72  * IS NOT TRUE or
27790 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f   IS NOT FALSE */
277a0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75  .      int isTru
277b0 65 3b 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55  e;     /* IS TRU
277c0 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45  E or IS NOT TRUE
277d0 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
277e0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
277f0 30 20 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74  0 );.      isNot
27800 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54   = pExpr->op2==T
27810 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69  K_ISNOT;.      i
27820 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45  sTrue = sqlite3E
27830 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45  xprTruthValue(pE
27840 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
27850 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
27860 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b  True && isNot );
27870 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27880 20 21 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f   !isTrue && isNo
27890 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  t );.      if( i
278a0 73 54 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b  sTrue ^ isNot ){
278b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
278c0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
278d0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
278e0 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20   dest,.         
278f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27900 20 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f   isNot ? SQLITE_
27910 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b  JUMPIFNULL : 0);
27920 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27930 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27940 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
27950 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
27960 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
27970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27980 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a  isNot ? SQLITE_J
27990 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a  UMPIFNULL : 0);.
279a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
279b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
279c0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
279d0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
279e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
279f0 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
27a00 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
27a10 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
27a20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
27a30 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
27a40 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  E;.      jumpIfN
27a50 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
27a60 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
27a70 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
27a80 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
27a90 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
27aa0 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
27ab0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
27ac0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
27ad0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
27ae0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
27af0 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
27b00 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
27b10 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
27b20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
27b30 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
27b40 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
27b50 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
27b60 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27b70 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
27b80 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
27b90 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
27ba0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
27bb0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
27bc0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
27bd0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
27be0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
27bf0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
27c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
27c10 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
27c20 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27c30 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
27c40 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
27c50 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
27c60 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
27c70 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
27c80 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
27c90 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
27ca0 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
27cb0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
27cc0 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
27cd0 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
27ce0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
27cf0 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
27d00 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
27d10 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
27d20 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
27d30 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
27d40 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
27d50 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
27d60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
27d70 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
27d80 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
27d90 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27da0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
27db0 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
27dc0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
27dd0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
27de0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
27df0 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
27e00 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
27e10 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
27e20 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
27e30 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
27e40 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
27e50 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
27e60 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
27e70 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
27e80 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
27e90 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27ea0 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
27eb0 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
27ec0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
27ed0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
27ee0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
27ef0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
27f00 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
27f10 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
27f20 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
27f30 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
27f40 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
27f50 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
27f60 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74  IsNull );   test
27f70 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
27f80 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ULL );.      ass
27f90 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
27fa0 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74  =OP_NotNull ); t
27fb0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
27fc0 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
27fd0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
27fe0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
27ff0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28000 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
28010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28020 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
28030 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  est);.      Vdbe
28040 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
28050 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20  ==TK_ISNULL);.  
28060 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
28070 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
28080 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
28090 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
280a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
280b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
280c0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
280d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
280e0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
280f0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
28100 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
28110 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
28120 74 65 33 45 78 70 72 49 66 54 72 75 65 2c 20 6a  te3ExprIfTrue, j
28130 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
28140 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
28150 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28160 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
28170 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
28180 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
28190 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
281a0 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
281b0 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  e);.      int de
281c0 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49  stIfNull = jumpI
281d0 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64  fNull ? dest : d
281e0 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20  estIfFalse;.    
281f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
28200 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
28210 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  r, destIfFalse, 
28220 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
28230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
28240 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
28250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
28260 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
28270 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
28280 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
28290 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
282a0 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74  t: {.    default
282b0 5f 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28  _expr:.      if(
282c0 20 45 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   ExprAlwaysTrue(
282d0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
282e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
282f0 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
28300 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
28310 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70  AlwaysFalse(pExp
28320 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
28330 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   No-op */.      
28340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
28350 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
28360 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
28370 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
28380 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28390 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
283a0 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c  OP_If, r1, dest,
283b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
283c0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
283d0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
283e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
283f0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
28400 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28410 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28420 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
28430 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
28440 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
28450 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
28460 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
28470 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
28480 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
28490 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
284a0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
284b0 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
284c0 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
284d0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
284e0 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
284f0 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
28500 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
28510 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
28520 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
28530 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
28540 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
28550 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
28560 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
28570 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
28580 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
28590 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
285a0 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
285b0 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
285c0 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
285d0 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
285e0 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
285f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
28600 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
28610 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
28620 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
28630 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
28640 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
28650 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
28660 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
28670 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
28680 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
28690 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
286a0 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
286b0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
286c0 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
286d0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
286e0 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
286f0 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74  return; /* Exist
28700 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
28710 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
28720 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
28730 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20   )    return;.. 
28740 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
28750 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
28760 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
28770 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
28780 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
28790 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
287a0 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
287b0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
287c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
287d0 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
287e0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
287f0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
28800 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
28810 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
28820 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
28830 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
28840 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
28860 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
28870 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
28880 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
28890 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
288a0 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
288b0 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
288c0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
288d0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
288f0 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
28900 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
28910 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
28920 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
28930 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
28940 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
28950 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
28960 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
28970 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
28980 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
28990 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
289a0 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
289b0 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
289c0 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
289d0 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
289e0 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
289f0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
28a00 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
28a10 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
28a20 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
28a30 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
28a40 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
28a50 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
28a60 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
28a70 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
28a80 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
28a90 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
28aa0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28ab0 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
28ac0 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
28ad0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
28ae0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
28af0 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
28b00 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28b10 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
28b20 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
28b30 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
28b40 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
28b50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
28b60 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
28b70 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
28b80 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28b90 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
28ba0 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
28bb0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28bc0 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
28bd0 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
28be0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
28bf0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
28c00 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
28c10 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 6c 74        Expr *pAlt
28c20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 69   = sqlite3ExprSi
28c30 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72 28 70 45  mplifiedAndOr(pE
28c40 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
28c50 70 41 6c 74 21 3d 70 45 78 70 72 20 29 7b 0a 20  pAlt!=pExpr ){. 
28c60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
28c70 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
28c80 2c 20 70 41 6c 74 2c 20 64 65 73 74 2c 20 6a 75  , pAlt, dest, ju
28c90 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
28ca0 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
28cb0 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
28cc0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
28cd0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
28ce0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28cf0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
28d00 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
28d10 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
28d20 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
28d30 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
28d40 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28d50 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
28d60 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
28d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28d80 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
28d90 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
28da0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
28db0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28dc0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
28dd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
28de0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
28df0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 0a 20  pr->pLeft, d2,. 
28e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e10 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 66 4e           jumpIfN
28e20 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
28e30 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
28e40 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
28e50 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
28e60 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
28e70 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
28e80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28e90 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
28ea0 64 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d2);.      }.   
28eb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28ec0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
28ed0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
28ee0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
28ef0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
28f00 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
28f10 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
28f20 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
28f30 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
28f40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
28f50 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20   TK_TRUTH: {.   
28f60 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20     int isNot;   
28f70 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f  /* IS NOT TRUE o
28f80 72 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a  r IS NOT FALSE *
28f90 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72  /.      int isTr
28fa0 75 65 3b 20 20 2f 2a 20 49 53 20 54 52 55 45 20  ue;  /* IS TRUE 
28fb0 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  or IS NOT TRUE *
28fc0 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
28fd0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
28fe0 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d  );.      isNot =
28ff0 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f   pExpr->op2==TK_
29000 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73 54  ISNOT;.      isT
29010 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rue = sqlite3Exp
29020 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
29030 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
29040 20 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72    testcase( isTr
29050 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20  ue && isNot );. 
29060 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21       testcase( !
29070 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20  isTrue && isNot 
29080 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  );.      if( isT
29090 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20  rue ^ isNot ){. 
290a0 20 20 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55         /* IS TRU
290b0 45 20 61 6e 64 20 49 53 20 4e 4f 54 20 46 41 4c  E and IS NOT FAL
290c0 53 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  SE */.        sq
290d0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
290e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
290f0 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20  pLeft, dest,.   
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29110 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
29120 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  0 : SQLITE_JUMPI
29130 46 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 7d  FNULL);..      }
29140 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
29150 20 49 53 20 46 41 4c 53 45 20 61 6e 64 20 49 53   IS FALSE and IS
29160 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
29170 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
29180 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
29190 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
291a0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
291b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e               isN
291c0 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f  ot ? 0 : SQLITE_
291d0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
291e0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
291f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
29200 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
29210 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20   TK_ISNOT:.     
29220 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
29230 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
29240 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
29250 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
29260 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  OT );.      op =
29270 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   (pExpr->op==TK_
29280 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b  IS) ? TK_NE : TK
29290 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49  _EQ;.      jumpI
292a0 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e  fNull = SQLITE_N
292b0 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20  ULLEQ;.      /* 
292c0 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  Fall thru */.   
292d0 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
292e0 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
292f0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
29300 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
29310 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
29320 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
29330 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29340 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78  ExprIsVector(pEx
29350 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74  pr->pLeft) ) got
29360 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a  o default_expr;.
29370 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29380 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
29390 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
293a0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
293b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
293c0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
293d0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
293e0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
293f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
29400 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
29410 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
29420 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
29430 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
29440 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
29450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29460 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
29470 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
29480 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
29490 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
294a0 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
294b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
294c0 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
294d0 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
294e0 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
294f0 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
29500 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
29510 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Le);.      as
29520 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
29530 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
29540 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
29550 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
29560 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Gt);.      asse
29570 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
29580 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
29590 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
295a0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
295b0 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
295c0 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
295d0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
295e0 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Eq);.      VdbeC
295f0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
29600 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
29610 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
29620 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
29630 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
29640 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
29650 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
29660 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73  LLEQ);.      ass
29670 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
29680 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
29690 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64  OP_Ne);.      Vd
296a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
296b0 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
296c0 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
296d0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
296e0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
296f0 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
29700 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
29710 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
29720 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
29730 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
29740 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
29750 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
29760 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
29770 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
29780 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
29790 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  LL: {.      r1 =
297a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
297b0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
297c0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
297d0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
297e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
297f0 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
29800 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
29810 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
29820 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;   VdbeCoverage
29830 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
29840 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
29850 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
29860 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76  NULL );  VdbeCov
29870 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
29880 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
29890 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
298a0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
298b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
298c0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
298d0 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
298e0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
298f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
29900 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
29910 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
29920 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
29930 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  lse, jumpIfNull)
29940 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
29950 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
29960 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
29970 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
29980 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75  : {.      if( ju
29990 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  mpIfNull ){.    
299a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
299b0 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
299c0 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29  xpr, dest, dest)
299d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
299e0 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49         int destI
299f0 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
29a00 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
29a10 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
29a20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
29a30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
29a40 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  est, destIfNull)
29a50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
29a60 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
29a70 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
29a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29a90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
29aa0 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
29ab0 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65   {.    default_e
29ac0 78 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20  xpr: .      if( 
29ad0 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  ExprAlwaysFalse(
29ae0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
29af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
29b00 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
29b10 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
29b20 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
29b30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
29b40 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  no-op */.      }
29b50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
29b60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
29b70 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
29b80 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
29b90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
29ba0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
29bb0 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73  P_IfNot, r1, des
29bc0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
29bd0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
29be0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
29bf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
29c00 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
29c10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
29c20 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
29c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
29c40 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
29c50 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
29c60 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
29c70 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
29c80 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
29c90 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
29ca0 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  e2);.}../*.** Li
29cb0 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  ke sqlite3ExprIf
29cc0 46 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74  False() except t
29cd0 68 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61  hat a copy is ma
29ce0 64 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f  de of pExpr befo
29cf0 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72  re.** code gener
29d00 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20  ation, and that 
29d10 63 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20  copy is deleted 
29d20 61 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72  after code gener
29d30 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65  ation. This.** e
29d40 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
29d50 6f 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69  original pExpr i
29d60 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  s unchanged..*/.
29d70 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
29d80 49 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65  IfFalseDup(Parse
29d90 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
29da0 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
29db0 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
29dc0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
29dd0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
29de0 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c  xpr *pCopy = sql
29df0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
29e00 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28  pExpr, 0);.  if(
29e10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
29e20 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
29e30 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
29e40 50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65  Parse, pCopy, de
29e50 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
29e60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
29e70 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
29e80 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  py);.}../*.** Ex
29e90 70 72 65 73 73 69 6f 6e 20 70 56 61 72 20 69 73  pression pVar is
29ea0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
29eb0 65 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c  e an SQL variabl
29ec0 65 2e 20 70 45 78 70 72 20 6d 61 79 20 62 65 20  e. pExpr may be 
29ed0 61 6e 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65  any.** type of e
29ee0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
29ef0 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73   If pExpr is a s
29f00 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20  imple SQL value 
29f10 2d 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65  - an integer, re
29f20 61 6c 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62  al, string, blob
29f30 0a 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75  .** or NULL valu
29f40 65 20 2d 20 74 68 65 6e 20 74 68 65 20 56 44 42  e - then the VDB
29f50 45 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  E currently bein
29f60 67 20 70 72 65 70 61 72 65 64 20 69 73 20 63 6f  g prepared is co
29f70 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72  nfigured.** to r
29f80 65 2d 70 72 65 70 61 72 65 20 65 61 63 68 20 74  e-prepare each t
29f90 69 6d 65 20 61 20 6e 65 77 20 76 61 6c 75 65 20  ime a new value 
29fa0 69 73 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69  is bound to vari
29fb0 61 62 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a  able pVar..**.**
29fc0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
29fd0 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d  f pExpr is a sim
29fe0 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 61 6e  ple SQL value an
29ff0 64 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 74  d the value is t
2a000 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68  he.** same as th
2a010 61 74 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75  at currently bou
2a020 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70  nd to variable p
2a030 56 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  Var, non-zero is
2a040 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74   returned..** Ot
2a050 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
2a060 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 74  values are not t
2a070 68 65 20 73 61 6d 65 20 6f 72 20 69 66 20 70 45  he same or if pE
2a080 78 70 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d  xpr is not a sim
2a090 70 6c 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65  ple.** SQL value
2a0a0 2c 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  , zero is return
2a0b0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2a0c0 74 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72  t exprCompareVar
2a0d0 69 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  iable(Parse *pPa
2a0e0 72 73 65 2c 20 45 78 70 72 20 2a 70 56 61 72 2c  rse, Expr *pVar,
2a0f0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2a100 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
2a110 69 6e 74 20 69 56 61 72 3b 0a 20 20 73 71 6c 69  int iVar;.  sqli
2a120 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a  te3_value *pL, *
2a130 70 52 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c  pR = 0;.  .  sql
2a140 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70  ite3ValueFromExp
2a150 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  r(pParse->db, pE
2a160 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  xpr, SQLITE_UTF8
2a170 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  , SQLITE_AFF_BLO
2a180 42 2c 20 26 70 52 29 3b 0a 20 20 69 66 28 20 70  B, &pR);.  if( p
2a190 52 20 29 7b 0a 20 20 20 20 69 56 61 72 20 3d 20  R ){.    iVar = 
2a1a0 70 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pVar->iColumn;. 
2a1b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
2a1c0 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
2a1d0 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20  >pVdbe, iVar);. 
2a1e0 20 20 20 70 4c 20 3d 20 73 71 6c 69 74 65 33 56     pL = sqlite3V
2a1f0 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
2a200 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70  (pParse->pReprep
2a210 61 72 65 2c 20 69 56 61 72 2c 20 53 51 4c 49 54  are, iVar, SQLIT
2a220 45 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20  E_AFF_BLOB);.   
2a230 20 69 66 28 20 70 4c 20 29 7b 0a 20 20 20 20 20   if( pL ){.     
2a240 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
2a250 75 65 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c  ue_type(pL)==SQL
2a260 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
2a270 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
2a280 65 5f 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d  e_text(pL); /* M
2a290 61 6b 65 20 73 75 72 65 20 74 68 65 20 65 6e 63  ake sure the enc
2a2a0 6f 64 69 6e 67 20 69 73 20 55 54 46 2d 38 20 2a  oding is UTF-8 *
2a2b0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
2a2c0 72 65 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65  res =  0==sqlite
2a2d0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20  3MemCompare(pL, 
2a2e0 70 52 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  pR, 0);.    }.  
2a2f0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
2a300 65 65 28 70 52 29 3b 0a 20 20 20 20 73 71 6c 69  ee(pR);.    sqli
2a310 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 29  te3ValueFree(pL)
2a320 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2a330 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  res;.}../*.** Do
2a340 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
2a350 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
2a360 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
2a370 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
2a380 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
2a390 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  are completely i
2a3a0 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72  dentical.  Retur
2a3b0 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66  n 1 if they diff
2a3c0 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20  er only.** by a 
2a3d0 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
2a3e0 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65   at the top leve
2a3f0 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20  l.  Return 2 if 
2a400 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
2a410 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74  ences.** other t
2a420 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  han the top-leve
2a430 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  l COLLATE operat
2a440 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  or..**.** If any
2a450 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
2a460 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
2a470 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
2a480 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
2a490 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
2a4a0 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
2a4b0 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
2a4c0 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
2a4d0 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iTab..**.** The 
2a4e0 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65  pA side might be
2a4f0 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
2a500 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  ER.  If that is 
2a510 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20  the case and pB 
2a520 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20  is.** not using 
2a530 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20  TK_REGISTER but 
2a540 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75  is otherwise equ
2a550 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74  ivalent, then st
2a560 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ill return 0..**
2a570 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  .** Sometimes th
2a580 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2a590 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66  return 2 even if
2a5a0 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
2a5b0 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
2a5c0 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
2a5d0 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
2a5e0 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
2a5f0 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
2a600 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
2a610 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65  urn 2 just to be
2a620 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
2a630 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
2a640 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f  turns 2, then yo
2a650 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
2a660 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
2a670 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
2a680 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
2a690 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
2a6a0 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20   you get a 0 or 
2a6b0 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  1 return, then y
2a6c0 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
2a6d0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
2a6e0 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
2a6f0 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
2a700 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
2a710 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
2a720 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
2a730 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32  o get an extra 2
2a740 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20   - that.** just 
2a750 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
2a760 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c  some slightly sl
2a770 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20  ower code.  But 
2a780 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20  returning.** an 
2a790 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31  incorrect 0 or 1
2a7a0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
2a7b0 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   malfunction..**
2a7c0 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73  .** If pParse is
2a7d0 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54   not NULL then T
2a7e0 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d 73  K_VARIABLE terms
2a7f0 20 69 6e 20 70 41 20 77 69 74 68 20 62 69 6e 64   in pA with bind
2a800 69 6e 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73  ings in.** pPars
2a810 65 2d 3e 70 52 65 70 72 65 70 61 72 65 20 63 61  e->pReprepare ca
2a820 6e 20 62 65 20 6d 61 74 63 68 65 64 20 61 67 61  n be matched aga
2a830 69 6e 73 74 20 6c 69 74 65 72 61 6c 73 20 69 6e  inst literals in
2a840 20 70 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50   pB.  The .** pP
2a850 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70  arse->pVdbe->exp
2a860 6d 61 73 6b 20 62 69 74 6d 61 73 6b 20 69 73 20  mask bitmask is 
2a870 75 70 64 61 74 65 64 20 66 6f 72 20 65 61 63 68  updated for each
2a880 20 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65   variable refere
2a890 6e 63 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72  nced..** If pPar
2a8a0 73 65 20 69 73 20 4e 55 4c 4c 20 28 74 68 65 20  se is NULL (the 
2a8b0 6e 6f 72 6d 61 6c 20 63 61 73 65 29 20 74 68 65  normal case) the
2a8c0 6e 20 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c  n any TK_VARIABL
2a8d0 45 20 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72  E term in .** Ar
2a8e0 67 75 6d 65 6e 74 20 70 50 61 72 73 65 20 73 68  gument pParse sh
2a8f0 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
2a900 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20   NULL. If it is 
2a910 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20  not NULL and pA 
2a920 6f 72 0a 2a 2a 20 70 42 20 63 61 75 73 65 73 20  or.** pB causes 
2a930 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  a return value o
2a940 66 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  f 2..*/.int sqli
2a950 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 50  te3ExprCompare(P
2a960 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
2a970 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
2a980 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75  , int iTab){.  u
2a990 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  32 combinedFlags
2a9a0 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c  ;.  if( pA==0 ||
2a9b0 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   pB==0 ){.    re
2a9c0 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20  turn pB==pA ? 0 
2a9d0 3a 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  : 2;.  }.  if( p
2a9e0 50 61 72 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d  Parse && pA->op=
2a9f0 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20  =TK_VARIABLE && 
2aa00 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61  exprCompareVaria
2aa10 62 6c 65 28 70 50 61 72 73 65 2c 20 70 41 2c 20  ble(pParse, pA, 
2aa20 70 42 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  pB) ){.    retur
2aa30 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69  n 0;.  }.  combi
2aa40 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66  nedFlags = pA->f
2aa50 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73  lags | pB->flags
2aa60 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  ;.  if( combined
2aa70 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  Flags & EP_IntVa
2aa80 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28  lue ){.    if( (
2aa90 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c  pA->flags&pB->fl
2aaa0 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29  ags&EP_IntValue)
2aab0 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61  !=0 && pA->u.iVa
2aac0 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75  lue==pB->u.iValu
2aad0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
2aae0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 0;.    }.    r
2aaf0 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
2ab00 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f  f( pA->op!=pB->o
2ab10 70 20 7c 7c 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f  p || pA->op==TK_
2ab20 52 41 49 53 45 20 29 7b 0a 20 20 20 20 69 66 28  RAISE ){.    if(
2ab30 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
2ab40 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
2ab50 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
2ab60 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42 2c 69  , pA->pLeft,pB,i
2ab70 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
2ab80 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2ab90 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d      if( pB->op==
2aba0 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
2abb0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2abc0 28 70 50 61 72 73 65 2c 20 70 41 2c 70 42 2d 3e  (pParse, pA,pB->
2abd0 70 4c 65 66 74 2c 69 54 61 62 29 3c 32 20 29 7b  pLeft,iTab)<2 ){
2abe0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2abf0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2ac00 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 2;.  }.  if( p
2ac10 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  A->op!=TK_COLUMN
2ac20 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41   && pA->op!=TK_A
2ac30 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  GG_COLUMN && pA-
2ac40 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
2ac50 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
2ac60 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70 41 2d 3e  FUNCTION || pA->
2ac70 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
2ac80 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ION ){.      if(
2ac90 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2aca0 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
2acb0 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20  >u.zToken)!=0 ) 
2acc0 72 65 74 75 72 6e 20 32 3b 0a 23 69 66 6e 64 65  return 2;.#ifnde
2acd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
2ace0 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 61  NDOWFUNC.      a
2acf0 73 73 65 72 74 28 20 70 41 2d 3e 6f 70 3d 3d 70  ssert( pA->op==p
2ad00 42 2d 3e 6f 70 20 29 3b 0a 20 20 20 20 20 20 69  B->op );.      i
2ad10 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
2ad20 74 79 28 70 41 2c 45 50 5f 57 69 6e 46 75 6e 63  ty(pA,EP_WinFunc
2ad30 29 21 3d 45 78 70 72 48 61 73 50 72 6f 70 65 72  )!=ExprHasProper
2ad40 74 79 28 70 42 2c 45 50 5f 57 69 6e 46 75 6e 63  ty(pB,EP_WinFunc
2ad50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
2ad60 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 2;.      }. 
2ad70 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
2ad80 50 72 6f 70 65 72 74 79 28 70 41 2c 45 50 5f 57  Property(pA,EP_W
2ad90 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  inFunc) ){.     
2ada0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 69     if( sqlite3Wi
2adb0 6e 64 6f 77 43 6f 6d 70 61 72 65 28 70 50 61 72  ndowCompare(pPar
2adc0 73 65 2c 20 70 41 2d 3e 79 2e 70 57 69 6e 2c 20  se, pA->y.pWin, 
2add0 70 42 2d 3e 79 2e 70 57 69 6e 2c 20 31 29 21 3d  pB->y.pWin, 1)!=
2ade0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
2adf0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 20  eturn 2;.       
2ae00 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
2ae10 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
2ae20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20  pA->op==TK_NULL 
2ae30 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2ae40 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
2ae50 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
2ae60 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ATE ){.      if(
2ae70 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
2ae80 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42  (pA->u.zToken,pB
2ae90 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29  ->u.zToken)!=0 )
2aea0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
2aeb0 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
2aec0 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 29  pB->u.zToken!=0)
2aed0 20 26 26 20 73 74 72 63 6d 70 28 70 41 2d 3e 75   && strcmp(pA->u
2aee0 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
2aef0 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  oken)!=0 ){.    
2af00 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
2af10 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d  }.  }.  if( (pA-
2af20 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
2af30 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67  inct)!=(pB->flag
2af40 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
2af50 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
2af60 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  f( (combinedFlag
2af70 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  s & EP_TokenOnly
2af80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2af90 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
2afa0 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72  EP_xIsSelect ) r
2afb0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
2afc0 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20   (combinedFlags 
2afd0 26 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 3d 3d  & EP_FixedCol)==
2afe0 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  0.     && sqlite
2aff0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
2b000 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 20  rse, pA->pLeft, 
2b010 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  pB->pLeft, iTab)
2b020 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
2b030 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2b040 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
2b050 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
2b060 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 20  pRight, iTab) ) 
2b070 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
2b080 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
2b090 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70  tCompare(pA->x.p
2b0a0 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73  List, pB->x.pLis
2b0b0 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
2b0c0 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  n 2;.    if( pA-
2b0d0 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 0a 20  >op!=TK_STRING. 
2b0e0 20 20 20 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54      && pA->op!=T
2b0f0 4b 5f 54 52 55 45 46 41 4c 53 45 0a 20 20 20 20  K_TRUEFALSE.    
2b100 20 26 26 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61   && (combinedFla
2b110 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64 29  gs & EP_Reduced)
2b120 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
2b130 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e   if( pA->iColumn
2b140 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
2b150 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20  return 2;.      
2b160 69 66 28 20 70 41 2d 3e 6f 70 32 21 3d 70 42 2d  if( pA->op2!=pB-
2b170 3e 6f 70 32 20 29 20 72 65 74 75 72 6e 20 32 3b  >op2 ) return 2;
2b180 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  .      if( pA->o
2b190 70 21 3d 54 4b 5f 49 4e 0a 20 20 20 20 20 20 20  p!=TK_IN.       
2b1a0 26 26 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70  && pA->iTable!=p
2b1b0 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20  B->iTable .     
2b1c0 20 20 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65    && (pA->iTable
2b1d0 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28  !=iTab || NEVER(
2b1e0 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20  pB->iTable>=0)) 
2b1f0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2b200 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2b210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
2b220 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  re two ExprList 
2b230 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e  objects.  Return
2b240 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20 69   0 if they are i
2b250 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a  dentical and .**
2b260 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
2b270 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20  y differ in any 
2b280 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  way..**.** If an
2b290 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20  y subelement of 
2b2a0 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62  pB has Expr.iTab
2b2b0 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74  le==(-1) then it
2b2c0 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
2b2d0 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  o compare equal 
2b2e0 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  to an equivalent
2b2f0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77   element in pA w
2b300 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  ith Expr.iTable=
2b310 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  =iTab..**.** Thi
2b320 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2b330 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
2b340 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45  for equivalent E
2b350 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a  xprLists.  The.*
2b360 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e  * only consequen
2b370 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62  ce will be disab
2b380 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  led optimization
2b390 73 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  s.  But this rou
2b3a0 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76  tine.** must nev
2b3b0 65 72 20 72 65 74 75 72 6e 20 30 20 69 66 20 74  er return 0 if t
2b3c0 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  he two ExprList 
2b3d0 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69 66 66  objects are diff
2b3e0 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d  erent, or.** a m
2b3f0 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  alfunction will 
2b400 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77  result..**.** Tw
2b410 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20  o NULL pointers 
2b420 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
2b430 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20  o be the same.  
2b440 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  But a NULL point
2b450 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66  er.** always dif
2b460 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  fers from a non-
2b470 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
2b480 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2b490 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72  ListCompare(Expr
2b4a0 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69  List *pA, ExprLi
2b4b0 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  st *pB, int iTab
2b4c0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
2b4d0 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30  ( pA==0 && pB==0
2b4e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
2b4f0 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
2b500 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
2b510 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70  if( pA->nExpr!=p
2b520 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72  B->nExpr ) retur
2b530 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 1;.  for(i=0; 
2b540 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  i<pA->nExpr; i++
2b550 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
2b560 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70  prA = pA->a[i].p
2b570 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
2b580 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69  pExprB = pB->a[i
2b590 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
2b5a0 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 46 6c   pA->a[i].sortFl
2b5b0 61 67 73 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f  ags!=pB->a[i].so
2b5c0 72 74 46 6c 61 67 73 20 29 20 72 65 74 75 72 6e  rtFlags ) return
2b5d0 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
2b5e0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
2b5f0 2c 20 70 45 78 70 72 41 2c 20 70 45 78 70 72 42  , pExprA, pExprB
2b600 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
2b610 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2b620 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b   0;.}../*.** Lik
2b630 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  e sqlite3ExprCom
2b640 70 61 72 65 28 29 20 65 78 63 65 70 74 20 43 4f  pare() except CO
2b650 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20  LLATE operators 
2b660 61 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  at the top-level
2b670 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  .** are ignored.
2b680 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2b690 78 70 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 45  xprCompareSkip(E
2b6a0 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70  xpr *pA, Expr *p
2b6b0 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
2b6c0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
2b6d0 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a 20 20 20  prCompare(0,.   
2b6e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b6f0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
2b700 41 6e 64 4c 69 6b 65 6c 79 28 70 41 29 2c 0a 20  AndLikely(pA),. 
2b710 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2b720 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2b730 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70 42 29 2c  teAndLikely(pB),
2b740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54  .             iT
2b750 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ab);.}../*.** Re
2b760 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
2b770 20 45 78 70 72 20 70 20 63 61 6e 20 6f 6e 6c 79   Expr p can only
2b780 20 62 65 20 74 72 75 65 20 69 66 20 70 4e 4e 20   be true if pNN 
2b790 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 2a 2a 0a  is not NULL..**.
2b7a0 2a 2a 20 4f 72 20 69 66 20 73 65 65 6e 4e 6f 74  ** Or if seenNot
2b7b0 20 69 73 20 74 72 75 65 2c 20 72 65 74 75 72 6e   is true, return
2b7c0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 45 78 70   non-zero if Exp
2b7d0 72 20 70 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a  r p can only be.
2b7e0 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 70  ** non-NULL if p
2b7f0 4e 4e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 0a 2a  NN is not NULL.*
2b800 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
2b810 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2b820 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2b830 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
2b840 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
2b850 78 70 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20  xpr *p,         
2b860 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
2b870 73 69 6f 6e 20 74 6f 20 62 65 20 63 68 65 63 6b  sion to be check
2b880 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4e  ed */.  Expr *pN
2b890 4e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  N,          /* T
2b8a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
2b8b0 61 74 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 20 2a  at is NOT NULL *
2b8c0 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
2b8d0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
2b8e0 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
2b8f0 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 4e 6f   */.  int seenNo
2b900 74 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  t         /* Ret
2b910 75 72 6e 20 74 72 75 65 20 6f 6e 6c 79 20 69 66  urn true only if
2b920 20 70 20 63 61 6e 20 62 65 20 61 6e 79 20 6e 6f   p can be any no
2b930 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a  n-NULL value */.
2b940 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  ){.  assert( p )
2b950 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 4e 20  ;.  assert( pNN 
2b960 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2b970 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2b980 73 65 2c 20 70 2c 20 70 4e 4e 2c 20 69 54 61 62  se, p, pNN, iTab
2b990 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
2b9a0 72 6e 20 70 4e 4e 2d 3e 6f 70 21 3d 54 4b 5f 4e  rn pNN->op!=TK_N
2b9b0 55 4c 4c 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  ULL;.  }.  switc
2b9c0 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
2b9d0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
2b9e0 20 20 20 20 69 66 28 20 73 65 65 6e 4e 6f 74 20      if( seenNot 
2b9f0 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
2ba00 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
2ba10 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ct) ) return 0;.
2ba20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
2ba30 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
2ba40 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20  EP_xIsSelect).  
2ba50 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e           || (p->
2ba60 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 70 2d  x.pList!=0 && p-
2ba70 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  >x.pList->nExpr>
2ba80 30 29 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  0) );.      retu
2ba90 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f  rn exprImpliesNo
2baa0 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d  tNull(pParse, p-
2bab0 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61  >pLeft, pNN, iTa
2bac0 62 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, 1);.    }.   
2bad0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
2bae0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
2baf0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 2d 3e 78  st *pList = p->x
2bb00 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 73  .pList;.      as
2bb10 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
2bb20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2bb30 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20  pList->nExpr==2 
2bb40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 65  );.      if( see
2bb50 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e 20 30 3b  nNot ) return 0;
2bb60 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72 49  .      if( exprI
2bb70 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50  mpliesNotNull(pP
2bb80 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 30  arse, pList->a[0
2bb90 5d 2e 70 45 78 70 72 2c 20 70 4e 4e 2c 20 69 54  ].pExpr, pNN, iT
2bba0 61 62 2c 20 31 29 0a 20 20 20 20 20 20 20 7c 7c  ab, 1).       ||
2bbb0 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2bbc0 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ull(pParse, pLis
2bbd0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2c 20 70  t->a[1].pExpr, p
2bbe0 4e 4e 2c 20 69 54 61 62 2c 20 31 29 0a 20 20 20  NN, iTab, 1).   
2bbf0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
2bc00 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
2bc10 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 78 70        return exp
2bc20 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2bc30 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66 74  pParse, p->pLeft
2bc40 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 31 29 3b  , pNN, iTab, 1);
2bc50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2bc60 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65 20  TK_EQ:.    case 
2bc70 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
2bc80 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
2bc90 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
2bca0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
2bcb0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
2bcc0 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  TK_PLUS:.    cas
2bcd0 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
2bce0 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
2bcf0 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
2bd00 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
2bd10 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
2bd20 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 0a 20 20 20   TK_CONCAT: .   
2bd30 20 20 20 73 65 65 6e 4e 6f 74 20 3d 20 31 3b 0a     seenNot = 1;.
2bd40 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
2bd50 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
2bd60 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
2bd70 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
2bd80 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
2bd90 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
2bda0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72  {.      if( expr
2bdb0 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70  ImpliesNotNull(p
2bdc0 50 61 72 73 65 2c 20 70 2d 3e 70 52 69 67 68 74  Parse, p->pRight
2bdd0 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65  , pNN, iTab, see
2bde0 6e 4e 6f 74 29 20 29 20 72 65 74 75 72 6e 20 31  nNot) ) return 1
2bdf0 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
2be00 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 6e 65  thru into the ne
2be10 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
2be20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41  .    case TK_SPA
2be30 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
2be40 4f 4c 4c 41 54 45 3a 0a 20 20 20 20 63 61 73 65  OLLATE:.    case
2be50 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63   TK_UPLUS:.    c
2be60 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
2be70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 78  .      return ex
2be80 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  prImpliesNotNull
2be90 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66  (pParse, p->pLef
2bea0 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65  t, pNN, iTab, se
2beb0 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20  enNot);.    }.  
2bec0 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a    case TK_TRUTH:
2bed0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 65 65   {.      if( see
2bee0 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e 20 30 3b  nNot ) return 0;
2bef0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
2bf00 32 21 3d 54 4b 5f 49 53 20 29 20 72 65 74 75 72  2!=TK_IS ) retur
2bf10 6e 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n 0;.      retur
2bf20 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74  n exprImpliesNot
2bf30 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e  Null(pParse, p->
2bf40 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62  pLeft, pNN, iTab
2bf50 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
2bf60 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
2bf70 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
2bf80 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
2bf90 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2bfa0 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  ll(pParse, p->pL
2bfb0 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20  eft, pNN, iTab, 
2bfc0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
2bfd0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2bfe0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2bff0 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74  f we can prove t
2c000 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61  he pE2 will alwa
2c010 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45  ys be true if pE
2c020 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52  1 is.** true.  R
2c030 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77  eturn false if w
2c040 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74  e cannot complet
2c050 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69  e the proof or i
2c060 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62  f pE2 might.** b
2c070 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c  e false.  Exampl
2c080 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45  es:.**.**     pE
2c090 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45  1: x==5       pE
2c0a0 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20  2: x==5         
2c0b0 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
2c0c0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30  .**     pE1: x>0
2c0d0 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d          pE2: x==
2c0e0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65  5             Re
2c0f0 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20  sult: false.**  
2c100 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20     pE1: x=21    
2c110 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20     pE2: x=21 OR 
2c120 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a  y=43     Result:
2c130 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
2c140 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32  : x!=123     pE2
2c150 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2c160 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
2c170 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f  **     pE1: x!=?
2c180 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53  1      pE2: x IS
2c190 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73   NOT NULL    Res
2c1a0 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
2c1b0 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20   pE1: x IS NULL 
2c1c0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
2c1d0 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66  ULL    Result: f
2c1e0 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  alse.**     pE1:
2c1f0 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a   x IS ?2    pE2:
2c200 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
2c210 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a    Reuslt: false.
2c220 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61  **.** When compa
2c230 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  ring TK_COLUMN n
2c240 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31  odes between pE1
2c250 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32   and pE2, if pE2
2c260 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61   has.** Expr.iTa
2c270 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d  ble<0 then assum
2c280 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72  e a table number
2c290 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a   given by iTab..
2c2a0 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20  **.** If pParse 
2c2b0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
2c2c0 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  n the values of 
2c2d0 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20  bound variables 
2c2e0 69 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a 20 63  in pE1 are .** c
2c2f0 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73 74 20  ompared against 
2c300 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20 69  literal values i
2c310 6e 20 70 45 32 20 61 6e 64 20 70 50 61 72 73 65  n pE2 and pParse
2c320 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b  ->pVdbe->expmask
2c330 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65 64 20   is.** modified 
2c340 74 6f 20 72 65 63 6f 72 64 20 77 68 69 63 68 20  to record which 
2c350 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20  bound variables 
2c360 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 2e 20  are referenced. 
2c370 20 49 66 20 70 50 61 72 73 65 20 0a 2a 2a 20 69   If pParse .** i
2c380 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 61 6c  s NULL, then fal
2c390 73 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  se will be retur
2c3a0 6e 65 64 20 69 66 20 70 45 31 20 63 6f 6e 74 61  ned if pE1 conta
2c3b0 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20 76 61  ins any bound va
2c3c0 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57  riables..**.** W
2c3d0 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
2c3e0 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74  turn false.  Ret
2c3f0 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68  urning true migh
2c400 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
2c410 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d  ance.** improvem
2c420 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ent.  Returning 
2c430 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73  false might caus
2c440 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
2c450 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  reduction, but.*
2c460 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  * it will always
2c470 20 67 69 76 65 20 74 68 65 20 63 6f 72 72 65 63   give the correc
2c480 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20  t answer and is 
2c490 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66  hence always saf
2c4a0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2c4b0 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
2c4c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2c4d0 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20  Expr *pE1, Expr 
2c4e0 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b  *pE2, int iTab){
2c4f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
2c500 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
2c510 2c 20 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62  , pE1, pE2, iTab
2c520 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
2c530 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
2c540 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20  pE2->op==TK_OR. 
2c550 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70    && (sqlite3Exp
2c560 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50 61  rImpliesExpr(pPa
2c570 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70  rse, pE1, pE2->p
2c580 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20  Left, iTab).    
2c590 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2c5a0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
2c5b0 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20  pr(pParse, pE1, 
2c5c0 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  pE2->pRight, iTa
2c5d0 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  b) ).  ){.    re
2c5e0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
2c5f0 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  ( pE2->op==TK_NO
2c600 54 4e 55 4c 4c 0a 20 20 20 26 26 20 65 78 70 72  TNULL.   && expr
2c610 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70  ImpliesNotNull(p
2c620 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2c630 3e 70 4c 65 66 74 2c 20 69 54 61 62 2c 20 30 29  >pLeft, iTab, 0)
2c640 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2c650 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2c660 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
2c670 73 20 69 73 20 74 68 65 20 45 78 70 72 20 6e 6f  s is the Expr no
2c680 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  de callback for 
2c690 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2c6a0 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 29 2e 0a  esNotNullRow()..
2c6b0 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
2c6c0 73 69 6f 6e 20 6e 6f 64 65 20 72 65 71 75 69 72  sion node requir
2c6d0 65 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  es that the tabl
2c6e0 65 20 61 74 20 70 57 61 6c 6b 65 72 2d 3e 69 43  e at pWalker->iC
2c6f0 75 72 0a 2a 2a 20 68 61 76 65 20 6f 6e 65 20 6f  ur.** have one o
2c700 72 20 6d 6f 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20  r more non-NULL 
2c710 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 73 65 74  column, then set
2c720 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
2c730 74 6f 20 31 20 61 6e 64 20 61 62 6f 72 74 2e 0a  to 1 and abort..
2c740 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2c750 6e 65 20 63 6f 6e 74 72 6f 6c 73 20 61 6e 20 6f  ne controls an o
2c760 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 46 61  ptimization.  Fa
2c770 6c 73 65 20 70 6f 73 69 74 69 76 65 73 20 28 73  lse positives (s
2c780 65 74 74 69 6e 67 0a 2a 2a 20 70 57 61 6c 6b 65  etting.** pWalke
2c790 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20 77 68  r->eCode to 1 wh
2c7a0 65 6e 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  en it should not
2c7b0 20 62 65 29 20 61 72 65 20 64 65 61 64 6c 79 2c   be) are deadly,
2c7c0 20 62 75 74 20 66 61 6c 73 65 2d 6e 65 67 61 74   but false-negat
2c7d0 69 76 65 73 0a 2a 2a 20 28 6e 65 76 65 72 20 73  ives.** (never s
2c7e0 65 74 74 69 6e 67 20 70 57 61 6c 6b 65 72 2d 3e  etting pWalker->
2c7f0 65 43 6f 64 65 29 20 69 73 20 61 20 68 61 72 6d  eCode) is a harm
2c800 6c 65 73 73 20 6d 69 73 73 65 64 20 6f 70 74 69  less missed opti
2c810 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  mization..*/.sta
2c820 74 69 63 20 69 6e 74 20 69 6d 70 6c 69 65 73 4e  tic int impliesN
2c830 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b 65 72  otNullRow(Walker
2c840 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2c850 2a 70 45 78 70 72 29 7b 0a 20 20 74 65 73 74 63  *pExpr){.  testc
2c860 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2c870 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
2c880 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78  .  testcase( pEx
2c890 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
2c8a0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66 28  UNCTION );.  if(
2c8b0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
2c8c0 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
2c8d0 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 57 52  oin) ) return WR
2c8e0 43 5f 50 72 75 6e 65 3b 0a 20 20 73 77 69 74 63  C_Prune;.  switc
2c8f0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
2c900 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
2c910 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  T:.    case TK_I
2c920 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
2c930 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 0a 20 20 20 20  TK_NOTNULL:.    
2c940 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
2c950 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
2c960 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a 20 20  case TK_CASE:.  
2c970 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20    case TK_IN:.  
2c980 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
2c990 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
2c9a0 54 52 55 54 48 3a 0a 20 20 20 20 20 20 74 65 73  TRUTH:.      tes
2c9b0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c9c0 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
2c9d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c9e0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55  xpr->op==TK_ISNU
2c9f0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
2ca00 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2ca10 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
2ca20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2ca30 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
2ca40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2ca50 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2ca60 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _OR );.      tes
2ca70 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2ca80 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20 20 20  ==TK_CASE );.   
2ca90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2caa0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
2cab0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2cac0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46   pExpr->op==TK_F
2cad0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
2cae0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2caf0 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 54 48 20 29  ->op==TK_TRUTH )
2cb00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
2cb10 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 63 61  RC_Prune;.    ca
2cb20 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
2cb30 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
2cb40 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70 72 2d 3e  >u.iCur==pExpr->
2cb50 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
2cb60 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2cb70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
2cb80 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2cb90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2cba0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2cbb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
2cbc0 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
2cbd0 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
2cbe0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
2cbf0 65 33 57 61 6c 6b 45 78 70 72 28 70 57 61 6c 6b  e3WalkExpr(pWalk
2cc00 65 72 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  er, pExpr->pLeft
2cc10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  );.      if( pWa
2cc20 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 29 7b 0a 20  lker->eCode ){. 
2cc30 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
2cc40 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
2cc50 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78     sqlite3WalkEx
2cc60 70 72 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70  pr(pWalker, pExp
2cc70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
2cc80 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
2cc90 20 57 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20   WRC_Prune;..   
2cca0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
2ccb0 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  :.      sqlite3W
2ccc0 61 6c 6b 45 78 70 72 28 70 57 61 6c 6b 65 72 2c  alkExpr(pWalker,
2ccd0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
2cce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2ccf0 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20 2f 2a 20  _Prune;..    /* 
2cd00 56 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 61  Virtual tables a
2cd10 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
2cd20 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6c 69  e constraints li
2cd30 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20 53 6f 0a 20  ke x=NULL.  So. 
2cd40 20 20 20 2a 2a 20 61 20 74 65 72 6d 20 6f 66 20     ** a term of 
2cd50 74 68 65 20 66 6f 72 6d 20 78 3d 79 20 64 6f 65  the form x=y doe
2cd60 73 20 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  s not prove that
2cd70 20 79 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 69   y is not null i
2cd80 66 20 78 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  f x.    ** is th
2cd90 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 76 69  e column of a vi
2cda0 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
2cdb0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20     case TK_EQ:. 
2cdc0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
2cdd0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
2cde0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
2cdf0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
2ce00 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
2ce10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2ce20 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
2ce30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2ce40 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2ce50 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _NE );.      tes
2ce60 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2ce70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==TK_LT );.     
2ce80 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2ce90 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ->op==TK_LE );. 
2cea0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2ceb0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
2cec0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2ced0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2cee0 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _GE );.      if(
2cef0 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
2cf00 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
2cf10 20 49 73 56 69 72 74 75 61 6c 28 70 45 78 70 72   IsVirtual(pExpr
2cf20 2d 3e 70 4c 65 66 74 2d 3e 79 2e 70 54 61 62 29  ->pLeft->y.pTab)
2cf30 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78  ).       || (pEx
2cf40 70 72 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pr->pRight->op==
2cf50 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56  TK_COLUMN && IsV
2cf60 69 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 52  irtual(pExpr->pR
2cf70 69 67 68 74 2d 3e 79 2e 70 54 61 62 29 29 0a 20  ight->y.pTab)). 
2cf80 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 72       ){.       r
2cf90 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2cfa0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 64 65  .      }..    de
2cfb0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
2cfc0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2cfd0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
2cfe0 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
2cff0 7a 65 72 6f 29 20 69 66 20 65 78 70 72 65 73 73  zero) if express
2d000 69 6f 6e 20 70 20 63 61 6e 20 6f 6e 6c 79 20 62  ion p can only b
2d010 65 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61  e true if at lea
2d020 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f 6c 75 6d 6e  st.** one column
2d030 20 6f 66 20 74 61 62 6c 65 20 69 54 61 62 20 69   of table iTab i
2d040 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20 20 49 6e 20  s non-null.  In 
2d050 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
2d060 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 65  urn true.** if e
2d070 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c  xpression p will
2d080 20 61 6c 77 61 79 73 20 62 65 20 4e 55 4c 4c 20   always be NULL 
2d090 6f 72 20 66 61 6c 73 65 20 69 66 20 65 76 65 72  or false if ever
2d0a0 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62  y column of iTab
2d0b0 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  .** is NULL..**.
2d0c0 2a 2a 20 46 61 6c 73 65 20 6e 65 67 61 74 69 76  ** False negativ
2d0d0 65 73 20 61 72 65 20 61 63 63 65 70 74 61 62 6c  es are acceptabl
2d0e0 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
2d0f0 64 73 2c 20 69 74 20 69 73 20 6f 6b 20 74 6f 20  ds, it is ok to 
2d100 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 20 65  return.** zero e
2d110 76 65 6e 20 69 66 20 65 78 70 72 65 73 73 69 6f  ven if expressio
2d120 6e 20 70 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  n p will never b
2d130 65 20 74 72 75 65 20 6f 66 20 65 76 65 72 79 20  e true of every 
2d140 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a  column of iTab.*
2d150 2a 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 66 61  * is NULL.  A fa
2d160 6c 73 65 20 6e 65 67 61 74 69 76 65 20 69 73 20  lse negative is 
2d170 6d 65 72 65 6c 79 20 61 20 6d 69 73 73 65 64 20  merely a missed 
2d180 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 70 70  optimization opp
2d190 6f 72 74 75 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20  ortunity..**.** 
2d1a0 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65 73 20  False positives 
2d1b0 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2c  are not allowed,
2d1c0 20 68 6f 77 65 76 65 72 2e 20 20 41 20 66 61 6c   however.  A fal
2d1d0 73 65 20 70 6f 73 69 74 69 76 65 20 6d 61 79 20  se positive may 
2d1e0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
2d1f0 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
2d200 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
2d210 20 70 20 74 68 61 74 20 61 72 65 20 6d 61 72 6b   p that are mark
2d220 65 64 20 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a  ed with EP_FromJ
2d230 6f 69 6e 20 28 61 6e 64 20 68 65 6e 63 65 20 74  oin (and hence t
2d240 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 0a 2a 2a  hat come from.**
2d250 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
2d260 20 63 6c 61 75 73 65 73 20 6f 66 20 4c 45 46 54   clauses of LEFT
2d270 20 4a 4f 49 4e 53 29 20 61 72 65 20 65 78 63 6c   JOINS) are excl
2d280 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20 61 6e  uded from the an
2d290 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  alysis..**.** Th
2d2a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2d2b0 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 61  ed to check if a
2d2c0 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62   LEFT JOIN can b
2d2d0 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
2d2e0 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  .** an ordinary 
2d2f0 4a 4f 49 4e 2e 20 20 54 68 65 20 70 20 61 72 67  JOIN.  The p arg
2d300 75 6d 65 6e 74 20 69 73 20 74 68 65 20 57 48 45  ument is the WHE
2d310 52 45 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  RE clause.  If t
2d320 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75  he WHERE.** clau
2d330 73 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74  se requires that
2d340 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e 20 6f 66 20   some column of 
2d350 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
2d360 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e  of the LEFT JOIN
2d370 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c  .** be non-NULL,
2d380 20 74 68 65 6e 20 74 68 65 20 4c 45 46 54 20 4a   then the LEFT J
2d390 4f 49 4e 20 63 61 6e 20 62 65 20 73 61 66 65 6c  OIN can be safel
2d3a0 79 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  y converted into
2d3b0 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20   an.** ordinary 
2d3c0 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  join..*/.int sql
2d3d0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e  ite3ExprImpliesN
2d3e0 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78 70 72 20 2a  onNullRow(Expr *
2d3f0 70 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  p, int iTab){.  
2d400 57 61 6c 6b 65 72 20 77 3b 0a 20 20 70 20 3d 20  Walker w;.  p = 
2d410 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
2d420 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28  ollateAndLikely(
2d430 70 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p);.  if( p==0 )
2d440 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
2d450 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55   p->op==TK_NOTNU
2d460 4c 4c 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d  LL ){.    p = p-
2d470 3e 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20  >pLeft;.  }else 
2d480 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  if( p->op==TK_AN
2d490 44 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  D ){.    if( sql
2d4a0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e  ite3ExprImpliesN
2d4b0 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70 4c 65  onNullRow(p->pLe
2d4c0 66 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  ft, iTab) ) retu
2d4d0 72 6e 20 31 3b 0a 20 20 20 20 70 20 3d 20 70 2d  rn 1;.    p = p-
2d4e0 3e 70 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20 77  >pRight;.  }.  w
2d4f0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2d500 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52   impliesNotNullR
2d510 6f 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ow;.  w.xSelectC
2d520 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77  allback = 0;.  w
2d530 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2d540 32 20 3d 20 30 3b 0a 20 20 77 2e 65 43 6f 64 65  2 = 0;.  w.eCode
2d550 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 69 43 75 72   = 0;.  w.u.iCur
2d560 20 3d 20 69 54 61 62 3b 0a 20 20 73 71 6c 69 74   = iTab;.  sqlit
2d570 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
2d580 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
2d590 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ode;.}../*.** An
2d5a0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2d5b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2d5c0 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
2d5d0 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
2d5e0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
2d5f0 69 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  if an expression
2d600 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65   can be evaluate
2d610 64 20 62 79 20 72 65 66 65 72 65 6e 63 65 20 74  d by reference t
2d620 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  o the.** index o
2d630 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76  nly, without hav
2d640 69 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72  ing to do a sear
2d650 63 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ch for the corre
2d660 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c  sponding.** tabl
2d670 65 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64  e entry.  The Id
2d680 78 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c  xCover.pIdx fiel
2d690 64 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20  d is the index. 
2d6a0 20 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a   IdxCover.iCur.*
2d6b0 2a 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  * is the cursor 
2d6c0 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  for the table..*
2d6d0 2f 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76 65  /.struct IdxCove
2d6e0 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  r {.  Index *pId
2d6f0 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  x;     /* The in
2d700 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64  dex to be tested
2d710 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f   for coverage */
2d720 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
2d730 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
2d740 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
2d750 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  le corresponding
2d760 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   to the index */
2d770 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .};../*.** Check
2d780 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
2d790 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 73 20   are references 
2d7a0 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  to columns in ta
2d7b0 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d  ble .** pWalker-
2d7c0 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43  >u.pIdxCover->iC
2d7d0 75 72 20 63 61 6e 20 62 65 20 73 61 74 69 73 66  ur can be satisf
2d7e0 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e  ied using the in
2d7f0 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e  dex.** pWalker->
2d800 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64  u.pIdxCover->pId
2d810 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
2d820 20 65 78 70 72 49 64 78 43 6f 76 65 72 28 57 61   exprIdxCover(Wa
2d830 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2d840 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
2d850 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
2d860 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45  _COLUMN.   && pE
2d870 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
2d880 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2d890 72 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71  r->iCur.   && sq
2d8a0 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
2d8b0 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  ex(pWalker->u.pI
2d8c0 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70  dxCover->pIdx, p
2d8d0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30  Expr->iColumn)<0
2d8e0 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  .  ){.    pWalke
2d8f0 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20  r->eCode = 1;.  
2d900 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
2d910 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rt;.  }.  return
2d920 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2d930 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
2d940 65 20 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49  e if an index pI
2d950 64 78 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68  dx on table with
2d960 20 63 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e   cursor iCur con
2d970 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68  tains will.** th
2d980 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
2d990 70 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  pr.  Return true
2d9a0 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f   if the index do
2d9b0 65 73 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20  es cover the.** 
2d9c0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66  expression and f
2d9d0 61 6c 73 65 20 69 66 20 74 68 65 20 70 45 78 70  alse if the pExp
2d9e0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66  r expression ref
2d9f0 65 72 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f  erences table co
2da00 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72  lumns.** that ar
2da10 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74  e not found in t
2da20 68 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  he index pIdx..*
2da30 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f  *.** An index co
2da40 76 65 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73  vering an expres
2da50 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  sion means that 
2da60 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
2da70 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74  an be.** evaluat
2da80 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68  ed using only th
2da90 65 20 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68  e index and with
2daa0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f  out having to lo
2dab0 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72  okup the.** corr
2dac0 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
2dad0 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  entry..*/.int sq
2dae0 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64  lite3ExprCovered
2daf0 42 79 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20  ByIndex(.  Expr 
2db00 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
2db10 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
2db20 65 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  e tested */.  in
2db30 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
2db40 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
2db50 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63  number for the c
2db60 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
2db70 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  le */.  Index *p
2db80 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Idx         /* T
2db90 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69  he index that mi
2dba0 67 68 74 20 62 65 20 75 73 65 64 20 66 6f 72 20  ght be used for 
2dbb0 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20  coverage */.){. 
2dbc0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72   Walker w;.  str
2dbd0 75 63 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f  uct IdxCover xco
2dbe0 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  v;.  memset(&w, 
2dbf0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
2dc00 20 78 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75   xcov.iCur = iCu
2dc10 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d  r;.  xcov.pIdx =
2dc20 20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72   pIdx;.  w.xExpr
2dc30 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49  Callback = exprI
2dc40 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70  dxCover;.  w.u.p
2dc50 49 64 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76  IdxCover = &xcov
2dc60 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2dc70 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
2dc80 20 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64    return !w.eCod
2dc90 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  e;.}.../*.** An 
2dca0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2dcb0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2dcc0 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
2dcd0 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
2dce0 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72  * to count refer
2dcf0 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63  ences to table c
2dd00 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72  olumns in the ar
2dd10 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a  guments of an .*
2dd20 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
2dd30 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74  tion, in order t
2dd40 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a  o implement the.
2dd50 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
2dd60 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74  onThisSrc() rout
2dd70 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ine..*/.struct S
2dd80 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c  rcCount {.  SrcL
2dd90 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  ist *pSrc;   /* 
2dda0 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46  One particular F
2ddb0 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ROM clause in a 
2ddc0 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a  nested query */.
2ddd0 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20    int nThis;    
2dde0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ddf0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
2de00 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73  lumns in pSrcLis
2de10 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65  t */.  int nOthe
2de20 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  r;      /* Numbe
2de30 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2de40 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74  to columns in ot
2de50 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73  her FROM clauses
2de60 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
2de70 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
2de80 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2de90 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74  columns..*/.stat
2dea0 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f  ic int exprSrcCo
2deb0 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  unt(Walker *pWal
2dec0 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2ded0 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45  ){.  /* The NEVE
2dee0 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  R() on the secon
2def0 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73  d term is becaus
2df00 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  e sqlite3Functio
2df10 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20  nUsesThisSrc(). 
2df20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61   ** is always ca
2df30 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69  lled before sqli
2df40 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2df50 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73  gregates() and s
2df60 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f  o the.  ** TK_CO
2df70 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79  LUMNs have not y
2df80 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  et been converte
2df90 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  d into TK_AGG_CO
2dfa0 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73  LUMN.  If.  ** s
2dfb0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
2dfc0 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75  esThisSrc() is u
2dfd0 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  sed differently 
2dfe0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  in the future, t
2dff0 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20  he.  ** NEVER() 
2e000 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
2e010 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66  removed. */.  if
2e020 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2e030 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28  COLUMN || NEVER(
2e040 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2e050 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20  G_COLUMN) ){.   
2e060 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
2e070 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d  ct SrcCount *p =
2e080 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63   pWalker->u.pSrc
2e090 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69  Count;.    SrcLi
2e0a0 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
2e0b0 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63  rc;.    int nSrc
2e0c0 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e   = pSrc ? pSrc->
2e0d0 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f  nSrc : 0;.    fo
2e0e0 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69  r(i=0; i<nSrc; i
2e0f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
2e100 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
2e110 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
2e120 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
2e130 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29      if( i<nSrc )
2e140 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73  {.      p->nThis
2e150 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ++;.    }else if
2e160 28 20 6e 53 72 63 3d 3d 30 20 7c 7c 20 70 45 78  ( nSrc==0 || pEx
2e170 70 72 2d 3e 69 54 61 62 6c 65 3c 70 53 72 63 2d  pr->iTable<pSrc-
2e180 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 7b  >a[0].iCursor ){
2e190 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 77  .      /* In a w
2e1a0 65 6c 6c 2d 66 6f 72 6d 65 64 20 70 61 72 73 65  ell-formed parse
2e1b0 20 74 72 65 65 20 28 6e 6f 20 6e 61 6d 65 20 72   tree (no name r
2e1c0 65 73 6f 6c 75 74 69 6f 6e 20 65 72 72 6f 72 73  esolution errors
2e1d0 29 2c 0a 20 20 20 20 20 20 2a 2a 20 54 4b 5f 43  ),.      ** TK_C
2e1e0 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 77 69 74 68  OLUMN nodes with
2e1f0 20 73 6d 61 6c 6c 65 72 20 45 78 70 72 2e 69 54   smaller Expr.iT
2e200 61 62 6c 65 20 76 61 6c 75 65 73 20 61 72 65 20  able values are 
2e210 69 6e 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  in an.      ** o
2e220 75 74 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 54  uter context.  T
2e230 68 6f 73 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  hose are the onl
2e240 79 20 6f 6e 65 73 20 74 6f 20 63 6f 75 6e 74 20  y ones to count 
2e250 61 73 20 22 6f 74 68 65 72 22 20 2a 2f 0a 20 20  as "other" */.  
2e260 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b      p->nOther++;
2e270 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2e280 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2e290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
2e2a0 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74  mine if any of t
2e2b0 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
2e2c0 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69  the pExpr Functi
2e2d0 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  on reference.** 
2e2e0 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72  pSrcList.  Retur
2e2f0 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64  n true if they d
2e300 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20  o.  Also return 
2e310 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63  true if the func
2e320 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61  tion.** has no a
2e330 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20  rguments or has 
2e340 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72  only constant ar
2e350 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
2e360 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a   false if pExpr.
2e370 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f  ** references co
2e380 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f  lumns but not co
2e390 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20  lumns of tables 
2e3a0 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73  found in pSrcLis
2e3b0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2e3c0 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
2e3d0 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72  sSrc(Expr *pExpr
2e3e0 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c  , SrcList *pSrcL
2e3f0 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ist){.  Walker w
2e400 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f  ;.  struct SrcCo
2e410 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72  unt cnt;.  asser
2e420 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
2e430 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
2e440 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
2e450 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
2e460 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2e470 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20   exprSrcCount;. 
2e480 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2e490 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ck = sqlite3Sele
2e4a0 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  ctWalkNoop;.  w.
2e4b0 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63  u.pSrcCount = &c
2e4c0 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d  nt;.  cnt.pSrc =
2e4d0 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74   pSrcList;.  cnt
2e4e0 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e  .nThis = 0;.  cn
2e4f0 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20  t.nOther = 0;.  
2e500 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
2e510 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78  ist(&w, pExpr->x
2e520 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  .pList);.  retur
2e530 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c  n cnt.nThis>0 ||
2e540 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a   cnt.nOther==0;.
2e550 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
2e560 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
2e570 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
2e580 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
2e590 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
2e5a0 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
2e5b0 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
2e5c0 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
2e5d0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
2e5e0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
2e5f0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
2e600 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
2e610 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
2e620 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
2e630 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
2e640 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
2e650 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
2e660 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
2e670 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
2e680 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  ol[0]),.       &
2e690 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
2e6a0 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
2e6b0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
2e6c0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
2e6d0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
2e6e0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2e6f0 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
2e700 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
2e710 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
2e720 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
2e730 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
2e740 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
2e750 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
2e760 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74  ggInfoFunc(sqlit
2e770 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
2e780 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
2e790 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  ;.  pInfo->aFunc
2e7a0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
2e7b0 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
2e7c0 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66  db, .       pInf
2e7d0 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->aFunc,.      
2e7e0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
2e7f0 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20  Func[0]),.      
2e800 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
2e810 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
2e820 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
2e830 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2e840 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63  the xExprCallbac
2e850 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c  k for a tree wal
2e860 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64  ker.  It is used
2e870 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
2e880 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2e890 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
2e8a0 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
2e8b0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2e8c0 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
2e8d0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
2e8e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e8f0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2e900 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2e910 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2e920 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
2e930 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
2e940 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
2e950 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
2e960 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
2e970 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
2e980 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
2e990 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
2e9a0 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 75 4e 43  gInfo = pNC->uNC
2e9b0 2e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 61 73  .pAggInfo;..  as
2e9c0 73 65 72 74 28 20 70 4e 43 2d 3e 6e 63 46 6c 61  sert( pNC->ncFla
2e9d0 67 73 20 26 20 4e 43 5f 55 41 67 67 49 6e 66 6f  gs & NC_UAggInfo
2e9e0 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   );.  switch( pE
2e9f0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
2ea00 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
2ea10 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
2ea20 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74  OLUMN: {.      t
2ea30 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2ea40 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2ea50 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
2ea60 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2ea70 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
2ea80 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
2ea90 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ee if the column
2eaa0 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68   is in one of th
2eab0 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
2eac0 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c  FROM.      ** cl
2ead0 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
2eae0 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20  egate query */. 
2eaf0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
2eb00 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a  pSrcList!=0) ){.
2eb10 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
2eb20 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2eb30 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
2eb40 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2eb50 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
2eb60 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
2eb70 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
2eb80 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
2eb90 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20   *pCol;.        
2eba0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2ebb0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2ebc0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2ebd0 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
2ebe0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
2ebf0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
2ec00 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->iCursor ){.   
2ec10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
2ec20 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
2ec30 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
2ec40 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74  t pExpr refers t
2ec50 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  o a table.      
2ec60 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
2ec70 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2ec80 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
2ec90 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20  gate query.  .  
2eca0 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2ecb0 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65           ** Make
2ecc0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
2ecd0 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67  e column in pAgg
2ece0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20  Info->aCol[] if 
2ecf0 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
2ed00 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65    ** is not an e
2ed10 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61  ntry there alrea
2ed20 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy..            
2ed30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
2ed40 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
2ed50 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66    pCol = pAggInf
2ed60 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  o->aCol;.       
2ed70 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
2ed80 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
2ed90 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  n; k++, pCol++){
2eda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2edb0 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d  f( pCol->iTable=
2edc0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
2edd0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
2ede0 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
2edf0 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
2ee00 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2ee10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2ee20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ee30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ee40 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41        if( (k>=pA
2ee50 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29  ggInfo->nColumn)
2ee60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2ee70 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f   (k = addAggInfo
2ee80 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64  Column(pParse->d
2ee90 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30  b, pAggInfo))>=0
2eea0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
2eeb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2eec0 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
2eed0 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  >aCol[k];.      
2eee0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
2eef0 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54  ab = pExpr->y.pT
2ef00 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
2ef10 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
2ef20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
2ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2ef40 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
2ef50 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
2ef60 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2ef70 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
2ef80 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
2ef90 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
2efa0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
2efb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2efc0 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
2efd0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2efe0 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
2eff0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
2f000 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2f010 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
2f020 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
2f030 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
2f040 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
2f050 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2f060 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2f070 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
2f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f090 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
2f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0b0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
2f0c0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
2f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
2f0e0 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
2f0f0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
2f100 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2f110 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2f120 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
2f130 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f150 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
2f160 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
2f170 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2f180 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2f190 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
2f1a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2f1b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2f1d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f1e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2f1f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2f200 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
2f210 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
2f220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2f230 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2f240 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
2f250 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
2f260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2f270 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2f280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2f290 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
2f2a0 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
2f2b0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
2f2c0 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
2f2d0 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
2f2e0 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
2f2f0 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
2f300 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
2f310 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
2f320 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
2f330 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
2f340 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
2f350 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
2f360 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
2f370 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
2f380 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
2f390 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
2f3a0 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2f3b0 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
2f3c0 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  duce);.         
2f3d0 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
2f3e0 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
2f3f0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2f400 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
2f410 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
2f420 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
2f430 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20  (i16)k;.        
2f440 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2f450 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
2f460 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
2f470 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
2f480 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
2f490 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
2f4a0 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
2f4b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2f4c0 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
2f4d0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
2f4e0 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
2f4f0 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67  if( (pNC->ncFlag
2f500 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63  s & NC_InAggFunc
2f510 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )==0.       && p
2f520 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
2f530 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a  pth==pExpr->op2.
2f540 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2f550 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
2f560 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
2f570 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
2f580 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
2f590 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
2f5a0 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
2f5b0 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
2f5c0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
2f5d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2f5e0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2f5f0 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
2f600 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
2f610 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2f620 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2f630 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
2f640 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2f650 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2f660 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  e(0, pItem->pExp
2f670 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30  r, pExpr, -1)==0
2f680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f690 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2f6a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2f6b0 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
2f6c0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
2f6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
2f6e0 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
2f6f0 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
2f700 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
2f710 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
2f720 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
2f730 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
2f740 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
2f750 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
2f760 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
2f770 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
2f780 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
2f790 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
2f7a0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2f7b0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2f7c0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2f7d0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
2f7e0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
2f7f0 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
2f800 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
2f810 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
2f820 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
2f830 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2f840 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  m;.            a
2f850 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2f860 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2f870 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
2f880 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2f890 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->pFunc = sqlite
2f8a0 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
2f8b0 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
2f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2f8d0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20  pr->u.zToken, . 
2f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8f0 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74    pExpr->x.pList
2f900 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   ? pExpr->x.pLis
2f910 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
2f920 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
2f930 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
2f940 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
2f950 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
2f960 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
2f970 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
2f980 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
2f990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f9a0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
2f9b0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
2f9c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f9e0 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
2f9f0 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
2fa00 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
2fa10 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2fa20 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
2fa30 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2fa40 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2fa50 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
2fa60 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2fa70 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
2fa80 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2fa90 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
2faa0 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20  educe);.        
2fab0 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
2fac0 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45  16)i;.        pE
2fad0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
2fae0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
2faf0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2fb00 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ne;.      }else{
2fb10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2fb20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
2fb30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2fb40 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2fb50 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
2fb60 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
2fb70 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61  gatesInSelect(Wa
2fb80 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
2fb90 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
2fba0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2fbb0 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  TER(pSelect);.  
2fbc0 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44  pWalker->walkerD
2fbd0 65 70 74 68 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  epth++;.  return
2fbe0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2fbf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61  .static void ana
2fc00 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
2fc10 53 65 6c 65 63 74 45 6e 64 28 57 61 6c 6b 65 72  SelectEnd(Walker
2fc20 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
2fc30 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55  t *pSelect){.  U
2fc40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2fc50 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c  pSelect);.  pWal
2fc60 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
2fc70 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  --;.}../*.** Ana
2fc80 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65  lyze the pExpr e
2fc90 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
2fca0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
2fcb0 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
2fcc0 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
2fcd0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
2fce0 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20  dded to AggInfo 
2fcf0 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d  object that pNC-
2fd00 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69  >pAggInfo.** poi
2fd10 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f  nts to.  Additio
2fd20 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20  nal entries are 
2fd30 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49  made on the AggI
2fd40 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a  nfo object as.**
2fd50 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
2fd60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
2fd70 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
2fd80 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
2fd90 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
2fda0 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
2fdb0 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
2fdc0 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
2fdd0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
2fde0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2fdf0 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
2fe00 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
2fe10 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2fe20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
2fe30 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
2fe40 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  te;.  w.xSelectC
2fe50 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
2fe60 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
2fe70 65 63 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ect;.  w.xSelect
2fe80 43 61 6c 6c 62 61 63 6b 32 20 3d 20 61 6e 61 6c  Callback2 = anal
2fe90 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2fea0 65 6c 65 63 74 45 6e 64 3b 0a 20 20 77 2e 77 61  electEnd;.  w.wa
2feb0 6c 6b 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20  lkerDepth = 0;. 
2fec0 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
2fed0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 30 3b 0a    w.pParse = 0;.
2fee0 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
2fef0 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
2ff00 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2ff10 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  &w, pExpr);.}../
2ff20 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
2ff30 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2ff40 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65  egates() for eve
2ff50 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
2ff60 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   an.** expressio
2ff70 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  n list.  Return 
2ff80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
2ff90 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rors..**.** If a
2ffa0 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64  n error is found
2ffb0 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69  , the analysis i
2ffc0 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a  s cut short..*/.
2ffd0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
2ffe0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
2fff0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
30000 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
30010 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
30020 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
30030 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
30040 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
30050 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
30060 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
30070 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
30080 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  m++){.      sqli
30090 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
300a0 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49  gregates(pNC, pI
300b0 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
300c0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
300d0 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c  Allocate a singl
300e0 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66  e new register f
300f0 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73  or use to hold s
30100 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ome intermediate
30110 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20   result..*/.int 
30120 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
30130 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
30140 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
30150 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20  nTempReg==0 ){. 
30160 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72     return ++pPar
30170 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20  se->nMem;.  }.  
30180 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61  return pParse->a
30190 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65  TempReg[--pParse
301a0 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a  ->nTempReg];.}..
301b0 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
301c0 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b   a register, mak
301d0 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ing available fo
301e0 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65  r reuse for some
301f0 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73   other.** purpos
30200 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
30210 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
30220 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
30230 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28  int iReg){.  if(
30240 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d   iReg && pParse-
30250 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
30260 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
30270 70 52 65 67 29 20 29 7b 0a 20 20 20 20 70 50 61  pReg) ){.    pPa
30280 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
30290 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
302a0 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  ] = iReg;.  }.}.
302b0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
302c0 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20  or deallocate a 
302d0 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f  block of nReg co
302e0 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
302f0 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ers..*/.int sqli
30300 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
30310 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
30320 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
30330 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67  i, n;.  if( nReg
30340 3d 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c  ==1 ) return sql
30350 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
30360 50 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50  Parse);.  i = pP
30370 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b  arse->iRangeReg;
30380 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .  n = pParse->n
30390 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20  RangeReg;.  if( 
303a0 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 70  nReg<=n ){.    p
303b0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
303c0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50   += nReg;.    pP
303d0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
303e0 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65  -= nReg;.  }else
303f0 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
30400 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
30410 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
30420 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  eg;.  }.  return
30430 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   i;.}.void sqlit
30440 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
30450 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
30460 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
30470 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65  nReg){.  if( nRe
30480 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  g==1 ){.    sqli
30490 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
304a0 67 28 70 50 61 72 73 65 2c 20 69 52 65 67 29 3b  g(pParse, iReg);
304b0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
304c0 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72  .  if( nReg>pPar
304d0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b  se->nRangeReg ){
304e0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
304f0 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20  ngeReg = nReg;. 
30500 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
30510 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d  eReg = iReg;.  }
30520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
30530 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  ll temporary reg
30540 69 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20  isters as being 
30550 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  unavailable for 
30560 72 65 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 77  reuse..**.** Alw
30570 61 79 73 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  ays invoke this 
30580 70 72 6f 63 65 64 75 72 65 20 61 66 74 65 72 20  procedure after 
30590 63 6f 64 69 6e 67 20 61 20 73 75 62 72 6f 75 74  coding a subrout
305a0 69 6e 65 20 6f 72 20 63 6f 2d 72 6f 75 74 69 6e  ine or co-routin
305b0 65 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20  e.** that might 
305c0 62 65 20 69 6e 76 6f 6b 65 64 20 66 72 6f 6d 20  be invoked from 
305d0 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66 20 74  other parts of t
305e0 68 65 20 63 6f 64 65 2c 20 74 6f 20 65 6e 73 75  he code, to ensu
305f0 72 65 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 73  re that.** the s
30600 75 62 2f 63 6f 2d 72 6f 75 74 69 6e 65 20 64 6f  ub/co-routine do
30610 65 73 20 6e 6f 74 20 75 73 65 20 72 65 67 69 73  es not use regis
30620 74 65 72 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77  ters in common w
30630 69 74 68 20 74 68 65 20 63 6f 64 65 20 74 68 61  ith the code tha
30640 74 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65  t.** invokes the
30650 20 73 75 62 2f 63 6f 2d 72 6f 75 74 69 6e 65 2e   sub/co-routine.
30660 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
30670 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
30680 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
30690 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  {.  pParse->nTem
306a0 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  pReg = 0;.  pPar
306b0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
306c0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69  0;.}../*.** Vali
306d0 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d  date that no tem
306e0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
306f0 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65  falls within the
30700 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69   range of.** iFi
30710 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c  rst..iLast, incl
30720 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75  usive.  This rou
30730 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
30740 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73  l from within as
30750 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d  sert().** statem
30760 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ents..*/.#ifdef 
30770 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74  SQLITE_DEBUG.int
30780 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49   sqlite3NoTempsI
30790 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  nRange(Parse *pP
307a0 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74  arse, int iFirst
307b0 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20  , int iLast){.  
307c0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61  int i;.  if( pPa
307d0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30  rse->nRangeReg>0
307e0 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
307f0 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d  RangeReg+pParse-
30800 3e 6e 52 61 6e 67 65 52 65 67 20 3e 20 69 46 69  >nRangeReg > iFi
30810 72 73 74 0a 20 20 20 26 26 20 70 50 61 72 73 65  rst.   && pParse
30820 2d 3e 69 52 61 6e 67 65 52 65 67 20 3c 3d 20 69  ->iRangeReg <= i
30830 4c 61 73 74 0a 20 20 29 7b 0a 20 20 20 20 20 72  Last.  ){.     r
30840 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66  eturn 0;.  }.  f
30850 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
30860 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29  ->nTempReg; i++)
30870 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
30880 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69  ->aTempReg[i]>=i
30890 46 69 72 73 74 20 26 26 20 70 50 61 72 73 65 2d  First && pParse-
308a0 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c  >aTempReg[i]<=iL
308b0 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ast ){.      ret
308c0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
308d0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
308e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
308f0 44 45 42 55 47 20 2a 2f 0a                       DEBUG */.