/ Hex Artifact Content
Login

Artifact eb9b2e8b19d28ff58d20585964052166c0d38620593a8ab5c66214415f850261:


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 26 26 20 41 4c 57 41  pList!=0 && ALWA
17e0: 59 53 28 21 45 78 70 72 48 61 73 50 72 6f 70 65  YS(!ExprHasPrope
17f0: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
1800: 65 63 74 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ect)) ){.       
1810: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1820: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57      for(i=0; ALW
1830: 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74  AYS(i<p->x.pList
1840: 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a  ->nExpr); i++){.
1850: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1860: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1870: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
1880: 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61  .pExpr, EP_Colla
1890: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  te) ){.         
18a0: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
18b0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
18c0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
18d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1900: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
1910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1920: 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  se{.      break;
1930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1940: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
1950: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f  lSeq(pParse, pCo
1960: 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c  ll) ){ .    pCol
1970: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
1980: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
1990: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
19a0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19b0: 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
19c0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a  sion pExpr. If.*
19d0: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  * there is no de
19e0: 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20  fined collating 
19f0: 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e  sequence, return
1a00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1a10: 65 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f 6c  e.** defautl col
1a20: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
1a30: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
1a40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1a50: 53 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Seq().**.** The 
1a60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1a70: 65 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f 72  eq() routine wor
1a80: 6b 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  ks the same exce
1a90: 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72 65  pt that it.** re
1aa0: 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
1ab0: 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65  ere is no define
1ac0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  d collation..*/.
1ad0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
1ae0: 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50 61  ExprNNCollSeq(Pa
1af0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1b00: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c  r *pExpr){.  Col
1b10: 6c 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74 65  lSeq *p = sqlite
1b20: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1b30: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 69  rse, pExpr);.  i
1b40: 66 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70 50  f( p==0 ) p = pP
1b50: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
1b60: 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  oll;.  assert( p
1b70: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1b80: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
1b90: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 74  rn TRUE if the t
1ba0: 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 68  wo expressions h
1bb0: 61 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ave equivalent c
1bc0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1bd0: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
1be0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74  e3ExprCollSeqMat
1bf0: 63 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ch(Parse *pParse
1c00: 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70  , Expr *pE1, Exp
1c10: 72 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c 53  r *pE2){.  CollS
1c20: 65 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71 6c  eq *pColl1 = sql
1c30: 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
1c40: 71 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b 0a  q(pParse, pE1);.
1c50: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1c60: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e  2 = sqlite3ExprN
1c70: 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  NCollSeq(pParse,
1c80: 20 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e 20   pE2);.  return 
1c90: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1ca0: 43 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70 43  Coll1->zName, pC
1cb0: 6f 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 3b  oll2->zName)==0;
1cc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1cd0: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
1ce0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1cf0: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
1d00: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1d10: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
1d20: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
1d30: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1d40: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
1d50: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1d60: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
1d70: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
1d80: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
1d90: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1da0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
1db0: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
1dc0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
1dd0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1de0: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
1df0: 61 66 66 31 3e 53 51 4c 49 54 45 5f 41 46 46 5f  aff1>SQLITE_AFF_
1e00: 4e 4f 4e 45 20 26 26 20 61 66 66 32 3e 53 51 4c  NONE && aff2>SQL
1e10: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
1e20: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
1e30: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
1e40: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
1e50: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
1e60: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
1e70: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
1e80: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
1e90: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
1ea0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1eb0: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
1ec0: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
1ed0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1ee0: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
1ef0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f00: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
1f10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1f20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1f30: 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BLOB;.    }.  }
1f40: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65  else{.    /* One
1f50: 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d   side is a colum
1f60: 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  n, the other is 
1f70: 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c  not. Use the col
1f80: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a  umns affinity. *
1f90: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66  /.    assert( af
1fa0: 66 31 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f1<=SQLITE_AFF_N
1fb0: 4f 4e 45 20 7c 7c 20 61 66 66 32 3c 3d 53 51 4c  ONE || aff2<=SQL
1fc0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a  ITE_AFF_NONE );.
1fd0: 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31      return (aff1
1fe0: 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  <=SQLITE_AFF_NON
1ff0: 45 20 3f 20 61 66 66 32 20 3a 20 61 66 66 31 29  E ? aff2 : aff1)
2000: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   | SQLITE_AFF_NO
2010: 4e 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  NE;.  }.}../*.**
2020: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
2030: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
2040: 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70    Return the typ
2050: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
2060: 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70  should.** be app
2070: 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65  lied to both ope
2080: 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64  rands prior to d
2090: 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69  oing the compari
20a0: 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  son..*/.static c
20b0: 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  har comparisonAf
20c0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
20d0: 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b  pr){.  char aff;
20e0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
20f0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70  ->op==TK_EQ || p
2100: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
2110: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
2120: 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LT ||.         
2130: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
2140: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
2150: 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GE || pExpr->
2160: 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20  op==TK_LE ||.   
2170: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
2180: 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72  ==TK_NE || pExpr
2190: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70  ->op==TK_IS || p
21a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
21b0: 4f 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OT );.  assert( 
21c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a  pExpr->pLeft );.
21d0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45    aff = sqlite3E
21e0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
21f0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  r->pLeft);.  if(
2200: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
2210: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
2220: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
2230: 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ty(pExpr->pRight
2240: 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20  , aff);.  }else 
2250: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
2260: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
2270: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
2280: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
2290: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
22a0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
22b0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
22c0: 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  r, aff);.  }else
22d0: 20 69 66 28 20 61 66 66 3d 3d 30 20 29 7b 0a 20   if( aff==0 ){. 
22e0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
22f0: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20  AFF_BLOB;.  }.  
2300: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
2310: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
2320: 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65  comparison expre
2330: 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20  ssion, eg. '=', 
2340: 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63  '<', IN(...) etc
2350: 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74  ..** idx_affinit
2360: 79 20 69 73 20 74 68 65 20 61 66 66 69 6e 69 74  y is the affinit
2370: 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  y of an indexed 
2380: 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74  column. Return t
2390: 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e  rue.** if the in
23a0: 64 65 78 20 77 69 74 68 20 61 66 66 69 6e 69 74  dex with affinit
23b0: 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d  y idx_affinity m
23c0: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  ay be used to im
23d0: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63  plement.** the c
23e0: 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78  omparison in pEx
23f0: 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pr..*/.int sqlit
2400: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
2410: 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  k(Expr *pExpr, c
2420: 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79  har idx_affinity
2430: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  ){.  char aff = 
2440: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
2450: 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28  ty(pExpr);.  if(
2460: 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f   aff<SQLITE_AFF_
2470: 54 45 58 54 20 29 7b 0a 20 20 20 20 72 65 74 75  TEXT ){.    retu
2480: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
2490: 61 66 66 3d 3d 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 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  rn idx_affinity=
24c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
24d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
24e0: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
24f0: 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66 69  ffinity(idx_affi
2500: 6e 69 74 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nity);.}../*.** 
2510: 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61  Return the P5 va
2520: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
2530: 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69  be used for a bi
2540: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  nary comparison.
2550: 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71  ** opcode (OP_Eq
2560: 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73  , OP_Ge etc.) us
2570: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45  ed to compare pE
2580: 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e  xpr1 and pExpr2.
2590: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69  .*/.static u8 bi
25a0: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78  naryCompareP5(Ex
25b0: 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72  pr *pExpr1, Expr
25c0: 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75   *pExpr2, int ju
25d0: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20  mpIfNull){.  u8 
25e0: 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69  aff = (char)sqli
25f0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
2600: 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d  pExpr2);.  aff =
2610: 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70   (u8)sqlite3Comp
2620: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
2630: 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a  r1, aff) | (u8)j
2640: 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  umpIfNull;.  ret
2650: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
2660: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
2670: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
2680: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
2690: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
26a0: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
26b0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
26c0: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
26d0: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
26e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
26f0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
2700: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
2710: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
2720: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
2730: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
2740: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
2750: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
2760: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
2770: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
2780: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
2790: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
27a0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
27b0: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
27c0: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   type..**.** Arg
27d0: 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75  ument pRight (bu
27e0: 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79  t not pLeft) may
27f0: 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   be a null point
2800: 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
2810: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63  ,.** it is not c
2820: 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f  onsidered..*/.Co
2830: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69  llSeq *sqlite3Bi
2840: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
2850: 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eq(.  Parse *pPa
2860: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c  rse, .  Expr *pL
2870: 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52  eft, .  Expr *pR
2880: 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  ight.){.  CollSe
2890: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65  q *pColl;.  asse
28a0: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69  rt( pLeft );.  i
28b0: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
28c0: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
28d0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
28e0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
28f0: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
2900: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
2910: 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c  t && (pRight->fl
2920: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
2930: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  )!=0 ){.    pCol
2940: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2950: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2960: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
2970: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2980: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2990: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
29a0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
29b0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
29c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
29d0: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
29e0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
29f0: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
2a00: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2a10: 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61  code for a compa
2a20: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
2a30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
2a40: 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72  deCompare(.  Par
2a50: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
2a60: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61  * The parsing (a
2a70: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
2a80: 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ng) context */. 
2a90: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
2aa0: 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f     /* The left o
2ab0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
2ac0: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a   *pRight,     /*
2ad0: 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   The right opera
2ae0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f  nd */.  int opco
2af0: 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  de,       /* The
2b00: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f   comparison opco
2b10: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c  de */.  int in1,
2b20: 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67   int in2, /* Reg
2b30: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70  ister holding op
2b40: 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20  erands */.  int 
2b50: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
2b60: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72   Jump here if tr
2b70: 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  ue.  */.  int ju
2b80: 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49  mpIfNull    /* I
2b90: 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20  f true, jump if 
2ba0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
2bb0: 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  s NULL */.){.  i
2bc0: 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64  nt p5;.  int add
2bd0: 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34  r;.  CollSeq *p4
2be0: 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65  ;..  p4 = sqlite
2bf0: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2c00: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2c10: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
2c20: 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61  p5 = binaryCompa
2c30: 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67  reP5(pLeft, pRig
2c40: 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ht, jumpIfNull);
2c50: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
2c60: 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72  3VdbeAddOp4(pPar
2c70: 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64  se->pVdbe, opcod
2c80: 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e  e, in2, dest, in
2c90: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
2cb0: 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c  oid*)p4, P4_COLL
2cc0: 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  SEQ);.  sqlite3V
2cd0: 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72  dbeChangeP5(pPar
2ce0: 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70  se->pVdbe, (u8)p
2cf0: 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  5);.  return add
2d00: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
2d10: 72 6e 20 74 72 75 65 20 69 66 20 65 78 70 72 65  rn true if expre
2d20: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61  ssion pExpr is a
2d30: 20 76 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73   vector, or fals
2d40: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
2d50: 2a 2a 20 41 20 76 65 63 74 6f 72 20 69 73 20 64  ** A vector is d
2d60: 65 66 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78  efined as any ex
2d70: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65  pression that re
2d80: 73 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20  sults in two or 
2d90: 6d 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  more.** columns 
2da0: 6f 66 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72  of result.  Ever
2db0: 79 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65  y TK_VECTOR node
2dc0: 20 69 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65   is an vector be
2dd0: 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72  cause the.** par
2de0: 73 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e  ser will not gen
2df0: 65 72 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f  erate a TK_VECTO
2e00: 52 20 77 69 74 68 20 66 65 77 65 72 20 74 68 61  R with fewer tha
2e10: 6e 20 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  n two entries..*
2e20: 2a 20 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43  * But a TK_SELEC
2e30: 54 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65  T might be eithe
2e40: 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20  r a vector or a 
2e50: 73 63 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e  scalar. It is on
2e60: 6c 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  ly.** considered
2e70: 20 61 20 76 65 63 74 6f 72 20 69 66 20 69 74 20   a vector if it 
2e80: 68 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  has two or more 
2e90: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a  result columns..
2ea0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2eb0: 70 72 49 73 56 65 63 74 6f 72 28 45 78 70 72 20  prIsVector(Expr 
2ec0: 2a 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72  *pExpr){.  retur
2ed0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  n sqlite3ExprVec
2ee0: 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31  torSize(pExpr)>1
2ef0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
2f00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  e expression pas
2f10: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
2f20: 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74  argument is of t
2f30: 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a  ype TK_VECTOR .*
2f40: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * return the num
2f50: 62 65 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ber of expressio
2f60: 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72  ns in the vector
2f70: 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70  . Or, if the exp
2f80: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  ression.** is a 
2f90: 73 75 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75  sub-select, retu
2fa0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2fb0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2fc0: 73 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a  sub-select. For.
2fd0: 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70  ** any other typ
2fe0: 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c  e of expression,
2ff0: 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e   return 1..*/.in
3000: 74 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  t sqlite3ExprVec
3010: 74 6f 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45  torSize(Expr *pE
3020: 78 70 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20  xpr){.  u8 op = 
3030: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
3040: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
3050: 20 29 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f   ) op = pExpr->o
3060: 70 32 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  p2;.  if( op==TK
3070: 5f 56 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72  _VECTOR ){.    r
3080: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70  eturn pExpr->x.p
3090: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
30a0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
30b0: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65  SELECT ){.    re
30c0: 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53  turn pExpr->x.pS
30d0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
30e0: 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Expr;.  }else{. 
30f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
3100: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3110: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
3120: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  subexpression of
3130: 20 70 56 65 63 74 6f 72 20 74 68 61 74 20 69 73   pVector that is
3140: 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c   the i-th.** col
3150: 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f  umn of the vecto
3160: 72 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72  r (numbered star
3170: 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54  ting with 0).  T
3180: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a  he caller must.*
3190: 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 20  * ensure that i 
31a0: 69 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  is within range.
31b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
31c0: 72 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63  r is really a sc
31d0: 61 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61  alar (and "scala
31e0: 72 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73  r" here includes
31f0: 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74   subqueries.** t
3200: 68 61 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e  hat return a sin
3210: 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65  gle column!) the
3220: 6e 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72  n return pVector
3230: 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a   unmodified..**.
3240: 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61 69  ** pVector retai
3250: 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  ns ownership of 
3260: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 75 62  the returned sub
3270: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
3280: 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f 72 20  * If the vector 
3290: 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e  is a (SELECT ...
32a0: 29 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  ) then the expre
32b0: 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69  ssion returned i
32c0: 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78  s.** just the ex
32d0: 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65  pression for the
32e0: 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68   i-th term of th
32f0: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e  e result set, an
3300: 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20  d may.** not be 
3310: 72 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61  ready for evalua
3320: 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65  tion because the
3330: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61   table cursor ha
3340: 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65  s not yet.** bee
3350: 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f  n positioned..*/
3360: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65  .Expr *sqlite3Ve
3370: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
3380: 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20  (Expr *pVector, 
3390: 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74  int i){.  assert
33a0: 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56  ( i<sqlite3ExprV
33b0: 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f  ectorSize(pVecto
33c0: 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  r) );.  if( sqli
33d0: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
33e0: 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20  pVector) ){.    
33f0: 61 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d  assert( pVector-
3400: 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74  >op2==0 || pVect
3410: 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  or->op==TK_REGIS
3420: 54 45 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70  TER );.    if( p
3430: 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53  Vector->op==TK_S
3440: 45 4c 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72  ELECT || pVector
3450: 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54  ->op2==TK_SELECT
3460: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
3470: 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c   pVector->x.pSel
3480: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  ect->pEList->a[i
3490: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c  ].pExpr;.    }el
34a0: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
34b0: 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73   pVector->x.pLis
34c0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
34d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
34e0: 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a  n pVector;.}../*
34f0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  .** Compute and 
3500: 72 65 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70  return a new Exp
3510: 72 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77  r object which w
3520: 68 65 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a  hen passed to.**
3530: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
3540: 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  () will generate
3550: 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63   all necessary c
3560: 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a  ode to compute.*
3570: 2a 20 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20  * the iField-th 
3580: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65  column of the ve
3590: 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ctor expression 
35a0: 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  pVector..**.** I
35b0: 74 20 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63  t is ok for pVec
35c0: 74 6f 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c  tor to be a scal
35d0: 61 72 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69  ar (as long as i
35e0: 46 69 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20  Field==0).  .** 
35f0: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
3600: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
3610: 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
3620: 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  rDup()..**.** Th
3630: 65 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68  e caller owns th
3640: 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72 20  e returned Expr 
3650: 6f 62 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65  object and is re
3660: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a  sponsible for.**
3670: 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
3680: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
3690: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74  e eventually get
36a0: 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  s freed..**.** T
36b0: 68 65 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e  he caller retain
36c0: 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70  s ownership of p
36d0: 56 65 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63  Vector.  If pVec
36e0: 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45  tor is a TK_SELE
36f0: 43 54 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  CT,.** then the 
3700: 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20  returned object 
3710: 77 69 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70  will reference p
3720: 56 65 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56  Vector and so pV
3730: 65 63 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69  ector must remai
3740: 6e 0a 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74  n.** valid for t
3750: 68 65 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72  he life of the r
3760: 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20  eturned object. 
3770: 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61   If pVector is a
3780: 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72   TK_VECTOR.** or
3790: 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
37a0: 73 69 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61  sion, then it ca
37b0: 6e 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20  n be deleted as 
37c0: 73 6f 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75  soon as this rou
37d0: 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e  tine.** returns.
37e0: 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74  .**.** A trick t
37f0: 6f 20 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c  o cause a TK_SEL
3800: 45 43 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62  ECT pVector to b
3810: 65 20 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68  e deleted togeth
3820: 65 72 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72  er with.** the r
3830: 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a  eturned Expr obj
3840: 65 63 74 20 69 73 20 74 6f 20 61 74 74 61 63 68  ect is to attach
3850: 20 74 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20   the pVector to 
3860: 74 68 65 20 70 52 69 67 68 74 20 66 69 65 6c 64  the pRight field
3870: 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72  .** of the retur
3880: 6e 65 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  ned TK_SELECT_CO
3890: 4c 55 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74  LUMN Expr object
38a0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
38b0: 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46  e3ExprForVectorF
38c0: 69 65 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70  ield(.  Parse *p
38d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
38e0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
38f0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
3900: 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  or,       /* The
3910: 20 76 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f   vector.  List o
3920: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72  f expressions or
3930: 20 61 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f   a sub-SELECT */
3940: 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20  .  int iField   
3950: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
3960: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76   column of the v
3970: 65 63 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20  ector to return 
3980: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52  */.){.  Expr *pR
3990: 65 74 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f  et;.  if( pVecto
39a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
39b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
39c0: 70 56 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26  pVector->flags &
39d0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b   EP_xIsSelect );
39e0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53  .    /* The TK_S
39f0: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70  ELECT_COLUMN Exp
3a00: 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20  r node:.    **. 
3a10: 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20     ** pLeft:    
3a20: 20 20 20 20 20 20 20 70 56 65 63 74 6f 72 20 63         pVector c
3a30: 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c  ontaining TK_SEL
3a40: 45 43 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65  ECT.  Not delete
3a50: 64 2e 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74  d..    ** pRight
3a60: 3a 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75  :          not u
3a70: 73 65 64 2e 20 20 42 75 74 20 72 65 63 75 72 73  sed.  But recurs
3a80: 69 76 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20  ively deleted.. 
3a90: 20 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20     ** iColumn:  
3aa0: 20 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20         Index of 
3ab0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63  a column in pVec
3ac0: 74 6f 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c  tor.    ** iTabl
3ad0: 65 3a 20 20 20 20 20 20 20 20 20 20 30 20 6f 72  e:          0 or
3ae0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
3af0: 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48  olumns on the LH
3b00: 53 20 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65  S of an assignme
3b10: 6e 74 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d  nt.    ** pLeft-
3b20: 3e 69 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74  >iTable:   First
3b30: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
3b40: 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
3b50: 20 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20   result, or 0.  
3b60: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
3b70: 20 20 20 20 20 20 69 66 20 74 68 65 20 72 65 73        if the res
3b80: 75 6c 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63  ult is not yet c
3b90: 6f 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  omputed..    **.
3ba0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78      ** sqlite3Ex
3bb0: 70 72 44 65 6c 65 74 65 28 29 20 73 70 65 63 69  prDelete() speci
3bc0: 66 69 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68  fically skips th
3bd0: 65 20 72 65 63 75 72 73 69 76 65 20 64 65 6c 65  e recursive dele
3be0: 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65  te of.    ** pLe
3bf0: 66 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f  ft on TK_SELECT_
3c00: 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42  COLUMN nodes.  B
3c10: 75 74 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c  ut pRight is fol
3c20: 6c 6f 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f  lowed, so pVecto
3c30: 72 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20  r.    ** can be 
3c40: 61 74 74 61 63 68 65 64 20 74 6f 20 70 52 69 67  attached to pRig
3c50: 68 74 20 74 6f 20 63 61 75 73 65 20 74 68 69 73  ht to cause this
3c60: 20 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77   node to take ow
3c70: 6e 65 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a  nership of.    *
3c80: 2a 20 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69  * pVector.  Typi
3c90: 63 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c  cally there will
3ca0: 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f   be multiple TK_
3cb0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f  SELECT_COLUMN no
3cc0: 64 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  des.    ** with 
3cd0: 74 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70  the same pLeft p
3ce0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56  ointer to the pV
3cf0: 65 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20  ector, but only 
3d00: 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  one of them.    
3d10: 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20  ** will own the 
3d20: 70 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  pVector..    */.
3d30: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
3d40: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
3d50: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
3d60: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
3d70: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70   pRet ){.      p
3d80: 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69  Ret->iColumn = i
3d90: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65  Field;.      pRe
3da0: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74  t->pLeft = pVect
3db0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
3dc0: 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c  sert( pRet==0 ||
3dd0: 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30   pRet->iTable==0
3de0: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
3df0: 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70   if( pVector->op
3e00: 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56  ==TK_VECTOR ) pV
3e10: 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d  ector = pVector-
3e20: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65  >x.pList->a[iFie
3e30: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  ld].pExpr;.    p
3e40: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
3e50: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
3e60: 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20   pVector, 0);.  
3e70: 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
3e80: 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65  okenRemap(pParse
3e90: 2c 20 70 52 65 74 2c 20 70 56 65 63 74 6f 72 29  , pRet, pVector)
3ea0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3eb0: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Ret;.}../*.** If
3ec0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
3ed0: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
3ee0: 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65  SELECT, generate
3ef0: 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
3f00: 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75 72 6e 20  e.** it. Return 
3f10: 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20  the register in 
3f20: 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c 74  which the result
3f30: 20 69 73 20 73 74 6f 72 65 64 20 28 6f 72 2c 20   is stored (or, 
3f40: 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73  if the .** sub-s
3f50: 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 6d 6f  elect returns mo
3f60: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
3f70: 6d 6e 2c 20 74 68 65 20 66 69 72 73 74 20 69 6e  mn, the first in
3f80: 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20   an array.** of 
3f90: 72 65 67 69 73 74 65 72 73 20 69 6e 20 77 68 69  registers in whi
3fa0: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ch the result is
3fb0: 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a 2a 20   stored)..**.** 
3fc0: 49 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20  If pExpr is not 
3fd0: 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70 72  a TK_SELECT expr
3fe0: 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 30  ession, return 0
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4000: 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63  exprCodeSubselec
4010: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
4020: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4030: 20 69 6e 74 20 72 65 67 20 3d 20 30 3b 0a 23 69   int reg = 0;.#i
4040: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4050: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
4060: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
4070: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 67  ELECT ){.    reg
4080: 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
4090: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
40a0: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 23 65 6e 64  pExpr);.  }.#end
40b0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b  if.  return reg;
40c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
40d0: 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74  nt pVector point
40e0: 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78  s to a vector ex
40f0: 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65  pression - eithe
4100: 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  r a TK_VECTOR.**
4110: 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68   or TK_SELECT th
4120: 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  at returns more 
4130: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e  than one column.
4140: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4150: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65  eturns.** the re
4160: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66  gister number of
4170: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
4180: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
4190: 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  lue of.** elemen
41a0: 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20  t iField of the 
41b0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  vector..**.** If
41c0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
41d0: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
41e0: 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  on, then code fo
41f0: 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a  r it must have .
4200: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4210: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
4220: 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73  the exprCodeSubs
4230: 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e  elect() routine.
4240: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
4250: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65   parameter regSe
4260: 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74  lect should be t
4270: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
4280: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
4290: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s.** containing 
42a0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
42b0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a  he sub-select. .
42c0: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
42d0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
42e0: 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65  ECTOR, then code
42f0: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
4300: 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67  ed field.** is g
4310: 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69  enerated. In thi
4320: 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65  s case (*pRegFre
4330: 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  e) may be set to
4340: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
4350: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  * a temporary re
4360: 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65  gister to be fre
4370: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
4380: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
4390: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
43a0: 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75  returning, outpu
43b0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70  t parameter (*pp
43c0: 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20  Expr) is set to 
43d0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
43e0: 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72  Expr object corr
43f0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65  esponding to ele
4400: 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68  ment iElem of th
4410: 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61  e vector..*/.sta
4420: 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74  tic int exprVect
4430: 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  orRegister(.  Pa
4440: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4460: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
4470: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
4480: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
4490: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f      /* Vector to
44a0: 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74   extract element
44b0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
44c0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
44d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
44e0: 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66  eld to extract f
44f0: 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20  rom pVector */. 
4500: 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20   int regSelect, 
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
4530: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4540: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
4550: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
4560: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70       /* OUT: Exp
4570: 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20  ression element 
4580: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72  */.  int *pRegFr
4590: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
45a0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d       /* OUT: Tem
45b0: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
45c0: 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70  ee */.){.  u8 op
45d0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a   = pVector->op;.
45e0: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
45f0: 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54  _VECTOR || op==T
4600: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70  K_REGISTER || op
4610: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
4620: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
4630: 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45  STER ){.    *ppE
4640: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63  xpr = sqlite3Vec
4650: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
4660: 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29  pVector, iField)
4670: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 65  ;.    return pVe
4680: 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69  ctor->iTable+iFi
4690: 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  eld;.  }.  if( o
46a0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
46b0: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56      *ppExpr = pV
46c0: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
46d0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65  ->pEList->a[iFie
46e0: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ld].pExpr;.     
46f0: 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74  return regSelect
4700: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a  +iField;.  }.  *
4710: 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72  ppExpr = pVector
4720: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
4730: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65  eld].pExpr;.  re
4740: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
4750: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
4760: 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72   *ppExpr, pRegFr
4770: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ee);.}../*.** Ex
4780: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
4790: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  s a comparison b
47a0: 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f  etween two vecto
47b0: 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74  r values. Comput
47c0: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
47d0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
47e0: 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c  n (1, 0, or NULL
47f0: 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  ) and write that
4800: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  .** result into 
4810: 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a  register dest..*
4820: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4830: 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65  must satisfy the
4840: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f   following preco
4850: 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  nditions:.**.** 
4860: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
4870: 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d  =TK_IS:      op=
4880: 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53  =TK_EQ and p5==S
4890: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
48a0: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
48b0: 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d  =TK_ISNOT:   op=
48c0: 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53  =TK_NE and p5==S
48d0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
48e0: 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20     otherwise:   
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d               op=
4900: 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70  =pExpr->op and p
4910: 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76  5==0.*/.static v
4920: 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f  oid codeVectorCo
4930: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
4940: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
4950: 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  * Code generator
4960: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4970: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
4980: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
4990: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
49a0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
49b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
49c0: 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
49d0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
49e0: 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20  /.  u8 op,      
49f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
4a00: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4a10: 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4a30: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20  QLITE_NULLEQ or 
4a40: 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  zero */.){.  Vdb
4a50: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4a60: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c  Vdbe;.  Expr *pL
4a70: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
4a80: 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft;.  Expr *pRig
4a90: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
4aa0: 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20  ht;.  int nLeft 
4ab0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
4ac0: 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
4ad0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4ae0: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e  egLeft = 0;.  in
4af0: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
4b00: 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20    u8 opx = op;. 
4b10: 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20   int addrDone = 
4b20: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4b30: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20  abel(pParse);.. 
4b40: 20 69 66 28 20 6e 4c 65 66 74 21 3d 73 71 6c 69   if( nLeft!=sqli
4b50: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
4b60: 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  e(pRight) ){.   
4b70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4b80: 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61  (pParse, "row va
4b90: 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20  lue misused");. 
4ba0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
4bb0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
4bc0: 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78  op==TK_EQ || pEx
4bd0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20  pr->op==TK_NE . 
4be0: 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
4bf0: 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78  op==TK_IS || pEx
4c00: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
4c10: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70   .       || pExp
4c20: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op==TK_LT || 
4c30: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  pExpr->op==TK_GT
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 45 20 7c 7c 20  r->op==TK_LE || 
4c60: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45  pExpr->op==TK_GE
4c70: 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28   .  );.  assert(
4c80: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c   pExpr->op==op |
4c90: 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
4ca0: 5f 49 53 20 26 26 20 6f 70 3d 3d 54 4b 5f 45 51  _IS && op==TK_EQ
4cb0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ).            ||
4cc0: 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   (pExpr->op==TK_
4cd0: 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d 54 4b 5f  ISNOT && op==TK_
4ce0: 4e 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NE) );.  assert(
4cf0: 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d   p5==0 || pExpr-
4d00: 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20 61 73 73  >op!=op );.  ass
4d10: 65 72 74 28 20 70 35 3d 3d 53 51 4c 49 54 45 5f  ert( p5==SQLITE_
4d20: 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78 70 72 2d  NULLEQ || pExpr-
4d30: 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20 20 70 35  >op==op );..  p5
4d40: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54 4f 52 45   |= SQLITE_STORE
4d50: 50 32 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d 54  P2;.  if( opx==T
4d60: 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20 54 4b 5f  K_LE ) opx = TK_
4d70: 4c 54 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d 54  LT;.  if( opx==T
4d80: 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20 54 4b 5f  K_GE ) opx = TK_
4d90: 47 54 3b 0a 0a 20 20 72 65 67 4c 65 66 74 20 3d  GT;..  regLeft =
4da0: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
4db0: 63 74 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  ct(pParse, pLeft
4dc0: 29 3b 0a 20 20 72 65 67 52 69 67 68 74 20 3d 20  );.  regRight = 
4dd0: 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63  exprCodeSubselec
4de0: 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  t(pParse, pRight
4df0: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 31  );..  for(i=0; 1
4e00: 20 2f 2a 4c 6f 6f 70 20 65 78 69 74 73 20 62 79   /*Loop exits by
4e10: 20 22 62 72 65 61 6b 22 2a 2f 3b 20 69 2b 2b 29   "break"*/; i++)
4e20: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 46 72 65  {.    int regFre
4e30: 65 31 20 3d 20 30 2c 20 72 65 67 46 72 65 65 32  e1 = 0, regFree2
4e40: 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 72 20 2a   = 0;.    Expr *
4e50: 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 69 6e  pL, *pR; .    in
4e60: 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 61 73  t r1, r2;.    as
4e70: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
4e80: 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20 72 31 20  nLeft );.    r1 
4e90: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
4ea0: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65  ster(pParse, pLe
4eb0: 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c 20  ft, i, regLeft, 
4ec0: 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29 3b  &pL, &regFree1);
4ed0: 0a 20 20 20 20 72 32 20 3d 20 65 78 70 72 56 65  .    r2 = exprVe
4ee0: 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61  ctorRegister(pPa
4ef0: 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69 2c 20  rse, pRight, i, 
4f00: 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c 20 26  regRight, &pR, &
4f10: 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 63  regFree2);.    c
4f20: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
4f30: 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c 20  e, pL, pR, opx, 
4f40: 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 70 35  r1, r2, dest, p5
4f50: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4f60: 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
4f70: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4f80: 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65 73  =OP_Lt);.    tes
4f90: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
4fa0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4fb0: 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
4fc0: 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d     testcase(op==
4fd0: 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
4fe0: 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
4ff0: 47 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Gt);.    testcas
5000: 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
5010: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
5020: 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 74  p==OP_Ge);.    t
5030: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
5040: 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
5050: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
5060: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
5070: 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
5080: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
5090: 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  P_Ne);.    sqlit
50a0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
50b0: 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
50c0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  1);.    sqlite3R
50d0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
50e0: 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
50f0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66  .    if( i==nLef
5100: 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62 72 65  t-1 ){.      bre
5110: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
5120: 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b 0a  ( opx==TK_EQ ){.
5130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5140: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
5150: 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64 72 44  Not, dest, addrD
5160: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
5170: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
5180: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
5190: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  LL;.    }else if
51a0: 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b 0a  ( opx==TK_NE ){.
51b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
51d0: 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65  , dest, addrDone
51e0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
51f0: 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d 20  v);.      p5 |= 
5200: 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b  SQLITE_KEEPNULL;
5210: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5220: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
5230: 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 54  _LT || op==TK_GT
5240: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c   || op==TK_LE ||
5250: 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20   op==TK_GE );.  
5260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5270: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73 65  ddOp2(v, OP_Else
5280: 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72 44 6f  NotEq, 0, addrDo
5290: 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ne);.      VdbeC
52a0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
52b0: 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56  =TK_LT);.      V
52c0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
52d0: 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20   op==TK_GT);.   
52e0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
52f0: 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29 3b  f(v, op==TK_LE);
5300: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
5310: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
5320: 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  GE);.      if( i
5330: 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78 20  ==nLeft-2 ) opx 
5340: 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = op;.    }.  }.
5350: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
5360: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
5370: 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20 53  rDone);.}..#if S
5380: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
5390: 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65  EPTH>0./*.** Che
53a0: 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  ck that argument
53b0: 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73   nHeight is less
53c0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
53d0: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a  o the maximum.**
53e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
53f0: 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74  h allowed. If it
5400: 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61   is not, leave a
5410: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
5420: 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f  in.** pParse..*/
5430: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
5440: 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73  CheckHeight(Pars
5450: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
5460: 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72  Height){.  int r
5470: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5480: 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20   int mxHeight = 
5490: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
54a0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
54b0: 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69  EXPR_DEPTH];.  i
54c0: 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69  f( nHeight>mxHei
54d0: 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
54e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
54f0: 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72  e, .       "Expr
5500: 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74  ession tree is t
5510: 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75  oo large (maximu
5520: 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78  m depth %d)", mx
5530: 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20  Height.    );.  
5540: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
5550: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
5560: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  n rc;.}../* The 
5570: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
5580: 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68  functions, heigh
5590: 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68  tOfExpr(), heigh
55a0: 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  tOfExprList().**
55b0: 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c   and heightOfSel
55c0: 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20  ect(), are used 
55d0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
55e0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a   maximum height.
55f0: 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ** of any expres
5600: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
5610: 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75  nced by the stru
5620: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
5630: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
5640: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
5650: 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69  this maximum hei
5660: 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ght is greater t
5670: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
5680: 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a  value pointed.**
5690: 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c   to by pnHeight,
56a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
56b0: 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20  meter, then set 
56c0: 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61  *pnHeight to tha
56d0: 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  t.** value..*/.s
56e0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
56f0: 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c  tOfExpr(Expr *p,
5700: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5710: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5720: 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a  if( p->nHeight>*
5730: 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  pnHeight ){.    
5740: 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d    *pnHeight = p-
5750: 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a  >nHeight;.    }.
5760: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
5770: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  d heightOfExprLi
5780: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
5790: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
57a0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
57b0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
57c0: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
57d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68  ++){.      heigh
57e0: 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e  tOfExpr(p->a[i].
57f0: 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29  pExpr, pnHeight)
5800: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
5810: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
5820: 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  OfSelect(Select 
5830: 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20 2a 70  *pSelect, int *p
5840: 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65 6c 65  nHeight){.  Sele
5850: 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  ct *p;.  for(p=p
5860: 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70 2d 3e  Select; p; p=p->
5870: 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68 65 69  pPrior){.    hei
5880: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68  ghtOfExpr(p->pWh
5890: 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ere, pnHeight);.
58a0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
58b0: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48  (p->pHaving, pnH
58c0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
58d0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d  htOfExpr(p->pLim
58e0: 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  it, pnHeight);. 
58f0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
5900: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
5910: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5920: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5930: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
5940: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5950: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
5960: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
5970: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
5980: 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48   Set the Expr.nH
5990: 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69  eight variable i
59a0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
59b0: 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a  passed as an .**
59c0: 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78   argument. An ex
59d0: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f  pression with no
59e0: 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e   children, Expr.
59f0: 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70  pList or .** Exp
5a00: 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72  r.pSelect member
5a10: 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66   has a height of
5a20: 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78   1. Any other ex
5a30: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20  pression.** has 
5a40: 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74  a height equal t
5a50: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  o the maximum he
5a60: 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65  ight of any othe
5a70: 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64  r .** referenced
5a80: 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a   Expr plus one..
5a90: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61  **.** Also propa
5aa0: 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61 74  gate EP_Propagat
5ab0: 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d 20  e flags up from 
5ac0: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f 20  Expr.x.pList to 
5ad0: 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20 69  Expr.flags,.** i
5ae0: 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  f appropriate..*
5af0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
5b00: 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72  prSetHeight(Expr
5b10: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5b20: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5b30: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  tOfExpr(p->pLeft
5b40: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68  , &nHeight);.  h
5b50: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5b60: 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29  Right, &nHeight)
5b70: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
5b80: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
5b90: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
5ba0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5bb0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48  ->x.pSelect, &nH
5bc0: 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20  eight);.  }else 
5bd0: 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29  if( p->x.pList )
5be0: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  {.    heightOfEx
5bf0: 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73  prList(p->x.pLis
5c00: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5c10: 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50    p->flags |= EP
5c20: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c  _Propagate & sql
5c30: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
5c40: 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  s(p->x.pList);. 
5c50: 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20   }.  p->nHeight 
5c60: 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d  = nHeight + 1;.}
5c70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
5c80: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
5c90: 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  iable using the 
5ca0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20  exprSetHeight() 
5cb0: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20  function. If.** 
5cc0: 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72  the height is gr
5cd0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d  eater than the m
5ce0: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65  aximum allowed e
5cf0: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c  xpression depth,
5d00: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
5d10: 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a  or in pParse..**
5d20: 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61  .** Also propaga
5d30: 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67  te all EP_Propag
5d40: 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74  ate flags from t
5d50: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
5d60: 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61  into.** Expr.fla
5d70: 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gs. .*/.void sql
5d80: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
5d90: 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20  tAndFlags(Parse 
5da0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
5db0: 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
5dc0: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
5dd0: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
5de0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  p);.  sqlite3Exp
5df0: 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61  rCheckHeight(pPa
5e00: 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29  rse, p->nHeight)
5e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5e20: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  n the maximum he
5e30: 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72  ight of any expr
5e40: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
5e50: 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65  renced.** by the
5e60: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
5e70: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
5e80: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
5e90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
5ea0: 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a  rHeight(Select *
5eb0: 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68  p){.  int nHeigh
5ec0: 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f  t = 0;.  heightO
5ed0: 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69  fSelect(p, &nHei
5ee0: 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  ght);.  return n
5ef0: 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 20  Height;.}.#else 
5f00: 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67 68  /* ABOVE:  Heigh
5f10: 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65 6e  t enforcement en
5f20: 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20 48  abled.  BELOW: H
5f30: 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e  eight enforcemen
5f40: 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50  t off */./*.** P
5f50: 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f  ropagate all EP_
5f60: 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20  Propagate flags 
5f70: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
5f80: 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78  pList into.** Ex
5f90: 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f  pr.flags. .*/.vo
5fa0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
5fb0: 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28  tHeightAndFlags(
5fc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
5fd0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
5fe0: 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 26   && p->x.pList &
5ff0: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
6000: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
6010: 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c  ct) ){.    p->fl
6020: 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67  ags |= EP_Propag
6030: 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78 70  ate & sqlite3Exp
6040: 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e  rListFlags(p->x.
6050: 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 64  pList);.  }.}.#d
6060: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
6070: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
6080: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
6090: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
60a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
60b0: 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f  is the core allo
60c0: 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e  cator for Expr n
60d0: 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  odes..**.** Cons
60e0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
60f0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
6100: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
6110: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
6120: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
6130: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f   and for the pTo
6140: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ken argument is 
6150: 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  a single allocat
6160: 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20  ion.** obtained 
6170: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
6180: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
6190: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
61a0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
61b0: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
61c0: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
61d0: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
61e0: 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  **.** If dequote
61f0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
6200: 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20  he token (if it 
6210: 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f  exists) is dequo
6220: 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ted..** If dequo
6230: 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20  te is false, no 
6240: 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72  dequoting is per
6250: 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64 65 51  formed.  The deQ
6260: 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uote.** paramete
6270: 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  r is ignored if 
6280: 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f  pToken is NULL o
6290: 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20 64  r if the token d
62a0: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61  oes not.** appea
62b0: 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  r to be quoted. 
62c0: 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20 77   If the quotes w
62d0: 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ere of the form 
62e0: 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75  "..." (double-qu
62f0: 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68  otes).** then th
6300: 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20 66  e EP_DblQuoted f
6310: 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
6320: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  e expression nod
6330: 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c  e..**.** Special
6340: 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54   case:  If op==T
6350: 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70 54  K_INTEGER and pT
6360: 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61  oken points to a
6370: 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20   string that.** 
6380: 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74 65  can be translate
6390: 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74 20  d into a 32-bit 
63a0: 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68  integer, then th
63b0: 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a  e token is not.*
63c0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54  * stored in u.zT
63d0: 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20  oken.  Instead, 
63e0: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
63f0: 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  es is written.**
6400: 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20 61   into u.iValue a
6410: 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  nd the EP_IntVal
6420: 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ue flag is set. 
6430: 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61 67   No extra storag
6440: 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65  e.** is allocate
6450: 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e  d to hold the in
6460: 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20 74  teger text and t
6470: 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67 20  he dequote flag 
6480: 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45  is ignored..*/.E
6490: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
64a0: 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65 33  Alloc(.  sqlite3
64b0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
64c0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73   /* Handle for s
64d0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
64e0: 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  wNN() */.  int o
64f0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6500: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6510: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e   opcode */.  con
6520: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  st Token *pToken
6530: 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72  ,    /* Token ar
6540: 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  gument.  Might b
6550: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
6560: 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20  dequote         
6570: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64      /* True to d
6580: 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45  equote */.){.  E
6590: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  xpr *pNew;.  int
65a0: 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69   nExtra = 0;.  i
65b0: 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a  nt iValue = 0;..
65c0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
65d0: 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  );.  if( pToken 
65e0: 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54  ){.    if( op!=T
65f0: 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54 6f  K_INTEGER || pTo
6600: 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20 20  ken->z==0.      
6610: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65      || sqlite3Ge
6620: 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a  tInt32(pToken->z
6630: 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b  , &iValue)==0 ){
6640: 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d 20  .      nExtra = 
6650: 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20  pToken->n+1;.   
6660: 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c 75     assert( iValu
6670: 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  e>=0 );.    }.  
6680: 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  }.  pNew = sqlit
6690: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
66a0: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29  db, sizeof(Expr)
66b0: 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20  +nExtra);.  if( 
66c0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d 73  pNew ){.    mems
66d0: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
66e0: 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 70  of(Expr));.    p
66f0: 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  New->op = (u8)op
6700: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67 67  ;.    pNew->iAgg
6710: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70   = -1;.    if( p
6720: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  Token ){.      i
6730: 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a  f( nExtra==0 ){.
6740: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
6750: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
6760: 75 65 7c 45 50 5f 4c 65 61 66 7c 28 69 56 61 6c  ue|EP_Leaf|(iVal
6770: 75 65 3f 45 50 5f 49 73 54 72 75 65 3a 45 50 5f  ue?EP_IsTrue:EP_
6780: 49 73 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IsFalse);.      
6790: 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
67a0: 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20   = iValue;.     
67b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
67c0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
67d0: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
67e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
67f0: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c  ( pToken->z!=0 |
6800: 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29  | pToken->n==0 )
6810: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
6820: 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79  oken->n ) memcpy
6830: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  (pNew->u.zToken,
6840: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
6850: 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  en->n);.        
6860: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70  pNew->u.zToken[p
6870: 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  Token->n] = 0;. 
6880: 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f         if( dequo
6890: 74 65 20 26 26 20 73 71 6c 69 74 65 33 49 73 71  te && sqlite3Isq
68a0: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
68b0: 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ken[0]) ){.     
68c0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
68d0: 6f 74 65 45 78 70 72 28 70 4e 65 77 29 3b 0a 20  oteExpr(pNew);. 
68e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
68f0: 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  .    }.#if SQLIT
6900: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
6910: 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65  >0.    pNew->nHe
6920: 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66  ight = 1;.#endif
6930: 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20    .  }.  return 
6940: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pNew;.}../*.** A
6950: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78  llocate a new ex
6960: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72  pression node fr
6970: 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  om a zero-termin
6980: 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20  ated token that 
6990: 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62  has.** already b
69a0: 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f  een dequoted..*/
69b0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
69c0: 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
69d0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
69e0: 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69   Handle for sqli
69f0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
6a00: 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20  ) (may be null) 
6a10: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
6a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6a30: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
6a40: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
6a50: 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f  r *zToken      /
6a60: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
6a70: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
6a80: 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78   */.){.  Token x
6a90: 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e  ;.  x.z = zToken
6aa0: 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65  ;.  x.n = sqlite
6ab0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
6ac0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
6ad0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
6ae0: 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a   op, &x, 0);.}..
6af0: 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62  /*.** Attach sub
6b00: 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20  trees pLeft and 
6b10: 70 52 69 67 68 74 20 74 6f 20 74 68 65 20 45 78  pRight to the Ex
6b20: 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a  pr node pRoot..*
6b30: 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e  *.** If pRoot==N
6b40: 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ULL that means t
6b50: 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c  hat a memory all
6b60: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
6b70: 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49  s occurred..** I
6b80: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c  n that case, del
6b90: 65 74 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ete the subtrees
6ba0: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
6bb0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
6bc0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
6bd0: 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20  rees(.  sqlite3 
6be0: 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f  *db,.  Expr *pRo
6bf0: 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  ot,.  Expr *pLef
6c00: 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  t,.  Expr *pRigh
6c10: 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74  t.){.  if( pRoot
6c20: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
6c30: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
6c40: 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  led );.    sqlit
6c50: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
6c60: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c   pLeft);.    sql
6c70: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6c80: 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65  b, pRight);.  }e
6c90: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69  lse{.    if( pRi
6ca0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  ght ){.      pRo
6cb0: 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ot->pRight = pRi
6cc0: 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  ght;.      pRoot
6cd0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
6ce0: 6f 70 61 67 61 74 65 20 26 20 70 52 69 67 68 74  opagate & pRight
6cf0: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
6d00: 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a     if( pLeft ){.
6d10: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65        pRoot->pLe
6d20: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20  ft = pLeft;.    
6d30: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
6d40: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
6d50: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20   pLeft->flags;. 
6d60: 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74     }.    exprSet
6d70: 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20  Height(pRoot);. 
6d80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
6d90: 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64  cate an Expr nod
6da0: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
6db0: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
6dc0: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
6dd0: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
6de0: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
6df0: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
6e00: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
6e10: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
6e20: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
6e30: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
6e40: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
6e50: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
6e60: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
6e70: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
6e80: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
6e90: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
6ea0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
6eb0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
6ec0: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
6ed0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6ee0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6ef0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
6f00: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
6f10: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
6f20: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
6f30: 70 52 69 67 68 74 20 20 20 20 20 20 20 20 20 20  pRight          
6f40: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
6f50: 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  nd */.){.  Expr 
6f60: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
6f70: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
6f80: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
6f90: 66 28 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20  f(Expr));.  if( 
6fa0: 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  p ){.    memset(
6fb0: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  p, 0, sizeof(Exp
6fc0: 72 29 29 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  r));.    p->op =
6fd0: 20 6f 70 20 26 20 30 78 66 66 3b 0a 20 20 20 20   op & 0xff;.    
6fe0: 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  p->iAgg = -1;.  
6ff0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
7000: 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72  achSubtrees(pPar
7010: 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74  se->db, p, pLeft
7020: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 73  , pRight);.    s
7030: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
7040: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
7050: 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c  >nHeight);.  }el
7060: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
7070: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
7080: 2d 3e 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  ->db, pLeft);.  
7090: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
70a0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
70b0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72  pRight);.  }.  r
70c0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
70d0: 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20 74 6f  * Add pSelect to
70e0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53 65 6c   the Expr.x.pSel
70f0: 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20  ect field.  Or, 
7100: 69 66 20 70 45 78 70 72 20 69 73 20 4e 55 4c 4c  if pExpr is NULL
7110: 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65   (due.** do a me
7120: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
7130: 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20 64 65  failure) then de
7140: 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65 63 74  lete the pSelect
7150: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   object..*/.void
7160: 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64 64   sqlite3PExprAdd
7170: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
7180: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
7190: 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
71a0: 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  ct){.  if( pExpr
71b0: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78   ){.    pExpr->x
71c0: 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65  .pSelect = pSele
71d0: 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50  ct;.    ExprSetP
71e0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
71f0: 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53  P_xIsSelect|EP_S
7200: 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71  ubquery);.    sq
7210: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
7220: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
7230: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c  e, pExpr);.  }el
7240: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
7250: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
7260: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
7270: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
7280: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
7290: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a  pSelect);.  }.}.
72a0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f  ../*.** Join two
72b0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69   expressions usi
72c0: 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ng an AND operat
72d0: 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65  or.  If either e
72e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
72f0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20  NULL, then just 
7300: 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72  return the other
7310: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
7320: 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f  ** If one side o
7330: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
7340: 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20  he AND is known 
7350: 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65  to be false, the
7360: 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20  n instead.** of 
7370: 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44  returning an AND
7380: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73   expression, jus
7390: 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74  t return a const
73a0: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ant expression w
73b0: 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f  ith.** a value o
73c0: 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72  f false..*/.Expr
73d0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64   *sqlite3ExprAnd
73e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
73f0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
7400: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 73 71  r *pRight){.  sq
7410: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7420: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c  se->db;.  if( pL
7430: 65 66 74 3d 3d 30 20 20 29 7b 0a 20 20 20 20 72  eft==0  ){.    r
7440: 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20  eturn pRight;.  
7450: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
7460: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7470: 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65  n pLeft;.  }else
7480: 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73 46   if( ExprAlwaysF
7490: 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 45  alse(pLeft) || E
74a0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
74b0: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71  Right) ){.    sq
74c0: 6c 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e  lite3ExprUnmapAn
74d0: 64 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20  dDelete(pParse, 
74e0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
74f0: 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64 44  te3ExprUnmapAndD
7500: 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70 52  elete(pParse, pR
7510: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
7520: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
7530: 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
7540: 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
7550: 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d  kens[0], 0);.  }
7560: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
7570: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
7580: 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 70 4c  arse, TK_AND, pL
7590: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
75a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
75b0: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
75c0: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
75d0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
75e0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
75f0: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
7600: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
7610: 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  on(.  Parse *pPa
7620: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
7630: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
7640: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
7650: 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 41 72 67  ist,      /* Arg
7660: 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20  ument list */.  
7670: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20  Token *pToken,  
7680: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7690: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
76a0: 0a 20 20 69 6e 74 20 65 44 69 73 74 69 6e 63 74  .  int eDistinct
76b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 46 5f 44           /* SF_D
76c0: 69 73 74 69 6e 63 74 20 6f 72 20 53 46 5f 41 4c  istinct or SF_AL
76d0: 4c 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 45  L or 0 */.){.  E
76e0: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c  xpr *pNew;.  sql
76f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7700: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
7710: 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65   pToken );.  pNe
7720: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
7730: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43  lloc(db, TK_FUNC
7740: 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29  TION, pToken, 1)
7750: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
7760: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
7770: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
7780: 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69   pList); /* Avoi
7790: 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68  d memory leak wh
77a0: 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  en malloc fails 
77b0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
77c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
77d0: 20 26 26 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   && pList->nExpr
77e0: 20 3e 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   > pParse->db->a
77f0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
7800: 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d  IT_FUNCTION_ARG]
7810: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7820: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7830: 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d 65  "too many argume
7840: 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  nts on function 
7850: 25 54 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  %T", pToken);.  
7860: 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73  }.  pNew->x.pLis
7870: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45 78 70  t = pList;.  Exp
7880: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65  rSetProperty(pNe
7890: 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29 3b 0a  w, EP_HasFunc);.
78a0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
78b0: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
78c0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
78d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ;.  sqlite3ExprS
78e0: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
78f0: 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b 0a  (pParse, pNew);.
7900: 20 20 69 66 28 20 65 44 69 73 74 69 6e 63 74 3d    if( eDistinct=
7910: 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 45  =SF_Distinct ) E
7920: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
7930: 4e 65 77 2c 20 45 50 5f 44 69 73 74 69 6e 63 74  New, EP_Distinct
7940: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
7950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
7960: 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  n a variable num
7970: 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73  ber to an expres
7980: 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65  sion that encode
7990: 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20  s a wildcard.** 
79a0: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
79b0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
79c0: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
79d0: 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
79e0: 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20   single "?" are 
79f0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78  assigned the nex
7a00: 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20  t sequential.** 
7a10: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e  variable number.
7a20: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
7a30: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
7a40: 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  nn" are assigned
7a50: 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e   the number "nnn
7a60: 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73  ".  We make.** s
7a70: 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74  ure "nnn" is not
7a80: 20 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69   too big to avoi
7a90: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
7aa0: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
7ab0: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
7ac0: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
7ad0: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
7ae0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
7af0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
7b00: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
7b10: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
7b20: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
7b30: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
7b40: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
7b50: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
7b60: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
7b70: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
7b80: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
7b90: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
7ba0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
7bb0: 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75  tial variable nu
7bc0: 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67  mber is.** assig
7bd0: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
7be0: 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61  ite3ExprAssignVa
7bf0: 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70  rNumber(Parse *p
7c00: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7c10: 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71  pr, u32 n){.  sq
7c20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7c30: 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20  se->db;.  const 
7c40: 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72  char *z;.  ynVar
7c50: 20 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72   x;..  if( pExpr
7c60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7c70: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
7c80: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
7c90: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
7ca0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
7cb0: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
7cc0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
7cd0: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
7ce0: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
7cf0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7d00: 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33 53  n==(u32)sqlite3S
7d10: 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20 20  trlen30(z) );.  
7d20: 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20  if( z[1]==0 ){. 
7d30: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
7d40: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
7d50: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
7d60: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
7d70: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
7d80: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20  z[0]=='?' );.   
7d90: 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70   x = (ynVar)(++p
7da0: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
7db0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 64  }else{.    int d
7dc0: 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69 66  oAdd = 0;.    if
7dd0: 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20  ( z[0]=='?' ){. 
7de0: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
7df0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
7e00: 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e  nn".  Convert "n
7e10: 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nn" to an intege
7e20: 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75  r and.      ** u
7e30: 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72  se it as the var
7e40: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
7e50: 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20        i64 i;.   
7e60: 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20 20     int bOk;.    
7e70: 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a    if( n==2 ){ /*
7e80: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d  OPTIMIZATION-IF-
7e90: 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20 69  TRUE*/.        i
7ea0: 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a   = z[1]-'0';  /*
7eb0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
7ec0: 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69 6e   of ?N for a sin
7ed0: 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a 20  gle digit N */. 
7ee0: 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a         bOk = 1;.
7ef0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7f00: 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73 71       bOk = 0==sq
7f10: 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31  lite3Atoi64(&z[1
7f20: 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49  ], &i, n-1, SQLI
7f30: 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
7f40: 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
7f50: 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( i==0 );.      
7f60: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29  testcase( i==1 )
7f70: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7f80: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
7f90: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
7fa0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20  IABLE_NUMBER]-1 
7fb0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7fc0: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
7fd0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7fe0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
7ff0: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d  ;.      if( bOk=
8000: 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64  =0 || i<1 || i>d
8010: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8020: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
8030: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20  NUMBER] ){.     
8040: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8050: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
8060: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
8070: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
8080: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
8090: 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b       db->aLimit[
80a0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
80b0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a  IABLE_NUMBER]);.
80c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
80d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78 20        }.      x 
80e0: 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20  = (ynVar)i;.    
80f0: 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e    if( x>pParse->
8100: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nVar ){.        
8110: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28  pParse->nVar = (
8120: 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20 64  int)x;.        d
8130: 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  oAdd = 1;.      
8140: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
8150: 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28  3VListNumToName(
8160: 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20  pParse->pVList, 
8170: 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  x)==0 ){.       
8180: 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20   doAdd = 1;.    
8190: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
81a0: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
81b0: 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22  s like ":aaa", "
81c0: 24 61 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e  $aaa" or "@aaa".
81d0: 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65    Reuse the same
81e0: 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20   variable.      
81f0: 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ** number as the
8200: 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63   prior appearanc
8210: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
8220: 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61  me, or if the na
8230: 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  me.      ** has 
8240: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
8250: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
8260: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
8270: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20  umber.      */. 
8280: 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29       x = (ynVar)
8290: 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d 65  sqlite3VListName
82a0: 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70 56  ToNum(pParse->pV
82b0: 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  List, z, n);.   
82c0: 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20     if( x==0 ){. 
82d0: 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61         x = (ynVa
82e0: 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61  r)(++pParse->nVa
82f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64  r);.        doAd
8300: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
8310: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 41     }.    if( doA
8320: 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  dd ){.      pPar
8330: 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71 6c  se->pVList = sql
8340: 69 74 65 33 56 4c 69 73 74 41 64 64 28 64 62 2c  ite3VListAdd(db,
8350: 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c   pParse->pVList,
8360: 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20 7d   z, n, x);.    }
8370: 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 43  .  }.  pExpr->iC
8380: 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66 28  olumn = x;.  if(
8390: 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   x>db->aLimit[SQ
83a0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
83b0: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20  BLE_NUMBER] ){. 
83c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
83d0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
83e0: 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c  many SQL variabl
83f0: 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  es");.  }.}../*.
8400: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64  ** Recursively d
8410: 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73  elete an express
8420: 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61  ion tree..*/.sta
8430: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
8440: 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33  INE void sqlite3
8450: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c  ExprDeleteNN(sql
8460: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
8470: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  p){.  assert( p!
8480: 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74  =0 );.  /* Sanit
8490: 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20  y check: Assert 
84a0: 74 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75  that the IntValu
84b0: 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  e is non-negativ
84c0: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a  e if it exists *
84d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  /.  assert( !Exp
84e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
84f0: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20  EP_IntValue) || 
8500: 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29  p->u.iValue>=0 )
8510: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  ;..  assert( !Ex
8520: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8530: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 7c 7c 20   EP_WinFunc) || 
8540: 70 2d 3e 79 2e 70 57 69 6e 21 3d 30 20 7c 7c 20  p->y.pWin!=0 || 
8550: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8560: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
8570: 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op!=TK_FUNCTION
8580: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
8590: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
85a0: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 0a  nly|EP_Reduced).
85b0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
85c0: 79 2e 70 57 69 6e 3d 3d 30 20 7c 7c 20 45 78 70  y.pWin==0 || Exp
85d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
85e0: 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a 23  EP_WinFunc) );.#
85f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
8600: 55 47 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  UG.  if( ExprHas
8610: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4c  Property(p, EP_L
8620: 65 61 66 29 20 26 26 20 21 45 78 70 72 48 61 73  eaf) && !ExprHas
8630: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
8640: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
8650: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 65 66   assert( p->pLef
8660: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t==0 );.    asse
8670: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
8680: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8690: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20  p->x.pSelect==0 
86a0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
86b0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
86c0: 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f 6b 65  erty(p, (EP_Toke
86d0: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20  nOnly|EP_Leaf)) 
86e0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45 78  ){.    /* The Ex
86f0: 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65  pr.x union is ne
8700: 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20  ver used at the 
8710: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70  same time as Exp
8720: 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20  r.pRight */.    
8730: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
8740: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
8750: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ht==0 );.    if(
8760: 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70 2d 3e   p->pLeft && p->
8770: 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op!=TK_SELECT_CO
8780: 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33 45 78  LUMN ) sqlite3Ex
8790: 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70  prDeleteNN(db, p
87a0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  ->pLeft);.    if
87b0: 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  ( p->pRight ){. 
87c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
87d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
87e0: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a   EP_WinFunc) );.
87f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8800: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 2d  rDeleteNN(db, p-
8810: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 65  >pRight);.    }e
8820: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
8830: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
8840: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
8850: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
8860: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8870: 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20 20  _WinFunc) );.   
8880: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
8890: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
88a0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
88b0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
88c0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
88d0: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
88e0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
88f0: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
8900: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
8910: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8920: 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
8930: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
8940: 6f 77 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  owDelete(db, p->
8950: 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20 20 20 7d  y.pWin);.      }
8960: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
8970: 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  }.  if( ExprHasP
8980: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65  roperty(p, EP_Me
8990: 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65  mToken) ) sqlite
89a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
89b0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20  .zToken);.  if( 
89c0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
89d0: 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29  (p, EP_Static) )
89e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
89f0: 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20  reeNN(db, p);.  
8a00: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
8a10: 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74  ExprDelete(sqlit
8a20: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
8a30: 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c 69  {.  if( p ) sqli
8a40: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8a50: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 20 49 6e  db, p);.}../* In
8a60: 76 6f 6b 65 20 73 71 6c 69 74 65 33 52 65 6e 61  voke sqlite3Rena
8a70: 6d 65 45 78 70 72 55 6e 6d 61 70 28 29 20 61 6e  meExprUnmap() an
8a80: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
8a90: 65 74 65 28 29 20 6f 6e 20 74 68 65 0a 2a 2a 20  ete() on the.** 
8aa0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 76  expression..*/.v
8ab0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 55  oid sqlite3ExprU
8ac0: 6e 6d 61 70 41 6e 64 44 65 6c 65 74 65 28 50 61  nmapAndDelete(Pa
8ad0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
8ae0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  r *p){.  if( p )
8af0: 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e  {.    if( IN_REN
8b00: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
8b10: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
8b20: 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61 72 73  eExprUnmap(pPars
8b30: 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, p);.    }.   
8b40: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8b50: 74 65 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c  teNN(pParse->db,
8b60: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
8b70: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
8b80: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c  ber of bytes all
8b90: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65  ocated for the e
8ba0: 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74  xpression struct
8bb0: 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61  ure .** passed a
8bc0: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
8bd0: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c  ment. This is al
8be0: 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52  ways one of EXPR
8bf0: 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58  _FULLSIZE,.** EX
8c00: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
8c10: 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  r EXPR_TOKENONLY
8c20: 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  SIZE..*/.static 
8c30: 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69  int exprStructSi
8c40: 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ze(Expr *p){.  i
8c50: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8c60: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
8c70: 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ly) ) return EXP
8c80: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b  R_TOKENONLYSIZE;
8c90: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
8ca0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64  operty(p, EP_Red
8cb0: 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45  uced) ) return E
8cc0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b  XPR_REDUCEDSIZE;
8cd0: 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46  .  return EXPR_F
8ce0: 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  ULLSIZE;.}../*.*
8cf0: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a  * The dupedExpr*
8d00: 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20  Size() routines 
8d10: 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20  each return the 
8d20: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
8d30: 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73  required.** to s
8d40: 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61  tore a copy of a
8d50: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20  n expression or 
8d60: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
8d70: 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e    They differ in
8d80: 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20  .** how much of 
8d90: 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73  the tree is meas
8da0: 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ured..**.**     
8db0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8dc0: 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f  ize()     Size o
8dd0: 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20  f only the Expr 
8de0: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20  structure .**   
8df0: 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53    dupedExprNodeS
8e00: 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65  ize()       Size
8e10: 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65   of Expr + space
8e20: 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20   for token.**   
8e30: 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28    dupedExprSize(
8e40: 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72  )           Expr
8e50: 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72   + token + subtr
8e60: 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a  ee components.**
8e70: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
8e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a 0a  ************.**.
8ec0: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8ed0: 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e  StructSize() fun
8ee0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77  ction returns tw
8ef0: 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74  o values OR-ed t
8f00: 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31  ogether:  .** (1
8f10: 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75  ) the space requ
8f20: 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20  ired for a copy 
8f30: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
8f40: 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a  cture only and .
8f50: 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78  ** (2) the EP_xx
8f60: 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64  x flags that ind
8f70: 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73  icate what the s
8f80: 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68  tructure size sh
8f90: 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20  ould be..** The 
8fa0: 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73  return values is
8fb0: 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a   always one of:.
8fc0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  **.**      EXPR_
8fd0: 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20  FULLSIZE.**     
8fe0: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
8ff0: 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64  E   | EP_Reduced
9000: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f  .**      EXPR_TO
9010: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50  KENONLYSIZE | EP
9020: 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a  _TokenOnly.**.**
9030: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
9040: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
9050: 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69  e found by maski
9060: 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ng the return va
9070: 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72  lue.** of this r
9080: 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66  outine with 0xff
9090: 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61  f.  The flags ca
90a0: 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61  n be found by ma
90b0: 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74  sking the.** ret
90c0: 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45  urn value with E
90d0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
90e0: 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  enOnly..**.** No
90f0: 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61  te that with fla
9100: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
9110: 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  CE, this routine
9120: 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d  s works on full-
9130: 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63  size.** (unreduc
9140: 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73  ed) Expr objects
9150: 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67   as they or orig
9160: 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74  inally construct
9170: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
9180: 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72  ..** During expr
9190: 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c  ession analysis,
91a0: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
91b0: 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61  on is computed a
91c0: 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a  nd moved into.**
91d0: 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20   later parts of 
91e0: 74 68 65 20 45 78 70 72 20 6f 62 6a 65 63 74 20  the Expr object 
91f0: 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69  and that extra i
9200: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74  nformation might
9210: 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20   get chopped.** 
9220: 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65  off if the expre
9230: 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64  ssion is reduced
9240: 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
9250: 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f  t it does not wo
9260: 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e  rk to.** make an
9270: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
9280: 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63 65  copy of a reduce
9290: 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  d expression.  I
92a0: 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a  t is only legal.
92b0: 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20 70  ** to reduce a p
92c0: 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73 69  ristine expressi
92d0: 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65  on tree from the
92e0: 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d   parser.  The im
92f0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  plementation.** 
9300: 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72 75  of dupedExprStru
9310: 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e  ctSize() contain
9320: 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74   multiple assert
9330: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  () statements th
9340: 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  at attempt.** to
9350: 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f   enforce this co
9360: 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61  nstraint..*/.sta
9370: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
9380: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
9390: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
93a0: 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20  .  int nSize;.  
93b0: 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45  assert( flags==E
93c0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c  XPRDUP_REDUCE ||
93d0: 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20   flags==0 ); /* 
93e0: 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61  Only one flag va
93f0: 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20  lue allowed */. 
9400: 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46 55   assert( EXPR_FU
9410: 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b  LLSIZE<=0xfff );
9420: 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66 66  .  assert( (0xff
9430: 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  f & (EP_Reduced|
9440: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d  EP_TokenOnly))==
9450: 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c  0 );.  if( 0==fl
9460: 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  ags || p->op==TK
9470: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 0a  _SELECT_COLUMN .
9480: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9490: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
94a0: 20 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70    || ExprHasProp
94b0: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
94c0: 6e 63 29 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  nc).#endif.  ){.
94d0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
94e0: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
94f0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
9500: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
9510: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
9520: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
9530: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9540: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9550: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20  EP_FromJoin) ); 
9560: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
9570: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9580: 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b   EP_MemToken) );
9590: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
95a0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
95b0: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b   EP_NoReduce) );
95c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66  .    if( p->pLef
95d0: 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20  t || p->x.pList 
95e0: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
95f0: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
9600: 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a  E | EP_Reduced;.
9610: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9620: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
9630: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ht==0 );.      n
9640: 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45  Size = EXPR_TOKE
9650: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
9660: 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a  okenOnly;.    }.
9670: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69    }.  return nSi
9680: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
9690: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
96a0: 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20  ns the space in 
96b0: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
96c0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
96d0: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72   .** of the Expr
96e0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
96f0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
9700: 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  r.u.zToken strin
9710: 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74  g (if that.** st
9720: 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e  ring is defined.
9730: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
9740: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
9750: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
9760: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
9770: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
9780: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
9790: 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66  s) & 0xfff;.  if
97a0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
97b0: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
97c0: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
97d0: 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  n ){.    nByte +
97e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
97f0: 30 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  0NN(p->u.zToken)
9800: 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +1;.  }.  return
9810: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
9820: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9830: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
9840: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
9850: 63 72 65 61 74 65 20 61 20 64 75 70 6c 69 63 61  create a duplica
9860: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78  te of the .** ex
9870: 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20  pression passed 
9880: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
9890: 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e  ument. The secon
98a0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a  d argument is a.
98b0: 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69  ** mask containi
98c0: 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58 20 66  ng EXPRDUP_XXX f
98d0: 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
98e0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
98f0: 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f  ncludes space to
9900: 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f   create a copy o
9910: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
9920: 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20  t.** itself and 
9930: 74 68 65 20 62 75 66 66 65 72 20 72 65 66 65 72  the buffer refer
9940: 72 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75  red to by Expr.u
9950: 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e  .zToken, if any.
9960: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  .**.** If the EX
9970: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
9980: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
9990: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
99a0: 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61  includes .** spa
99b0: 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20  ce to duplicate 
99c0: 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69  all Expr nodes i
99d0: 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65  n the tree forme
99e0: 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20  d by Expr.pLeft 
99f0: 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69  .** and Expr.pRi
9a00: 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28 62  ght variables (b
9a10: 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73  ut not for any s
9a20: 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65  tructures pointe
9a30: 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63  d to or .** desc
9a40: 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45  ended from the E
9a50: 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45  xpr.x.pList or E
9a60: 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61  xpr.x.pSelect va
9a70: 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61  riables)..*/.sta
9a80: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
9a90: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  rSize(Expr *p, i
9aa0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
9ab0: 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66   nByte = 0;.  if
9ac0: 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  ( p ){.    nByte
9ad0: 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65   = dupedExprNode
9ae0: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
9af0: 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45 58      if( flags&EX
9b00: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a  PRDUP_REDUCE ){.
9b10: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64        nByte += d
9b20: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e  upedExprSize(p->
9b30: 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20  pLeft, flags) + 
9b40: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
9b50: 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b  >pRight, flags);
9b60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9b70: 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a  urn nByte;.}../*
9b80: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
9b90: 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  n is similar to 
9ba0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 29  sqlite3ExprDup()
9bb0: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 66  , except that if
9bc0: 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73   pzBuffer .** is
9bd0: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a   not NULL then *
9be0: 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73 75  pzBuffer is assu
9bf0: 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  med to point to 
9c00: 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20 65  a buffer large e
9c10: 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f  nough .** to sto
9c20: 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65  re the copy of e
9c30: 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65  xpression p, the
9c40: 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e   copies of p->u.
9c50: 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70  zToken.** (if ap
9c60: 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74  plicable), and t
9c70: 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  he copies of the
9c80: 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d   p->pLeft and p-
9c90: 3e 70 52 69 67 68 74 20 65 78 70 72 65 73 73 69  >pRight expressi
9ca0: 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20  ons,.** if any. 
9cb0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
9cc0: 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73  , *pzBuffer is s
9cd0: 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  et to the first 
9ce0: 62 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a  byte past the.**
9cf0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
9d00: 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e  buffer copied in
9d10: 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  to by this funct
9d20: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ion..*/.static E
9d30: 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c  xpr *exprDup(sql
9d40: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
9d50: 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67 73 2c  p, int dupFlags,
9d60: 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b   u8 **pzBuffer){
9d70: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20  .  Expr *pNew;  
9d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
9d90: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
9da0: 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20   u8 *zAlloc;    
9db0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
9dc0: 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68 69 63   space from whic
9dd0: 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70 72 20  h to build Expr 
9de0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20  object */.  u32 
9df0: 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20 20 20  staticFlag;     
9e00: 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63 20 69    /* EP_Static i
9e10: 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62 74 61  f space not obta
9e20: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
9e30: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64   */..  assert( d
9e40: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
9e50: 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ( p );.  assert(
9e60: 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20   dupFlags==0 || 
9e70: 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55  dupFlags==EXPRDU
9e80: 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61 73  P_REDUCE );.  as
9e90: 73 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d  sert( pzBuffer==
9ea0: 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45  0 || dupFlags==E
9eb0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b  XPRDUP_REDUCE );
9ec0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
9ed0: 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65  t where to write
9ee0: 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74   the new Expr st
9ef0: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66  ructure. */.  if
9f00: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
9f10: 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75    zAlloc = *pzBu
9f20: 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74 69 63  ffer;.    static
9f30: 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63  Flag = EP_Static
9f40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
9f50: 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
9f60: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
9f70: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9f80: 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a 20 20  , dupFlags));.  
9f90: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30    staticFlag = 0
9fa0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28  ;.  }.  pNew = (
9fb0: 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a  Expr *)zAlloc;..
9fc0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
9fd0: 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a    /* Set nNewSiz
9fe0: 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c  e to the size al
9ff0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
a000: 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
a010: 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70  d to.    ** by p
a020: 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69 74  New. This is eit
a030: 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  her EXPR_FULLSIZ
a040: 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44 53  E, EXPR_REDUCEDS
a050: 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58  IZE or.    ** EX
a060: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
a070: 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20  . nToken is set 
a080: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
a090: 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a   bytes consumed.
a0a0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f      ** by the co
a0b0: 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a  py of the p->u.z
a0c0: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
a0d0: 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20   any)..    */.  
a0e0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
a0f0: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64   nStructSize = d
a100: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
a110: 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b  ze(p, dupFlags);
a120: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  .    const int n
a130: 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63  NewSize = nStruc
a140: 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20  tSize & 0xfff;. 
a150: 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20     int nToken;. 
a160: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
a170: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
a180: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
a190: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  zToken ){.      
a1a0: 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33  nToken = sqlite3
a1b0: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
a1c0: 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d  oken) + 1;.    }
a1d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b  else{.      nTok
a1e0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  en = 0;.    }.  
a1f0: 20 20 69 66 28 20 64 75 70 46 6c 61 67 73 20 29    if( dupFlags )
a200: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a210: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a220: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d  p, EP_Reduced)==
a230: 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  0 );.      memcp
a240: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65  y(zAlloc, p, nNe
a250: 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  wSize);.    }els
a260: 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 53 69  e{.      u32 nSi
a270: 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72 53 74  ze = (u32)exprSt
a280: 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20  ructSize(p);.   
a290: 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63     memcpy(zAlloc
a2a0: 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  , p, nSize);.   
a2b0: 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50     if( nSize<EXP
a2c0: 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20  R_FULLSIZE ){ . 
a2d0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a         memset(&z
a2e0: 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c  Alloc[nSize], 0,
a2f0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e   EXPR_FULLSIZE-n
a300: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
a310: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
a320: 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c   the EP_Reduced,
a330: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61   EP_TokenOnly, a
a340: 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61  nd EP_Static fla
a350: 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  gs appropriately
a360: 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66  . */.    pNew->f
a370: 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64  lags &= ~(EP_Red
a380: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
a390: 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d  y|EP_Static|EP_M
a3a0: 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e  emToken);.    pN
a3b0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74  ew->flags |= nSt
a3c0: 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52  ructSize & (EP_R
a3d0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a3e0: 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nly);.    pNew->
a3f0: 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46  flags |= staticF
a400: 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70  lag;..    /* Cop
a410: 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65  y the p->u.zToke
a420: 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79  n string, if any
a430: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f  . */.    if( nTo
a440: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ken ){.      cha
a450: 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77  r *zToken = pNew
a460: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68  ->u.zToken = (ch
a470: 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77  ar*)&zAlloc[nNew
a480: 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  Size];.      mem
a490: 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75  cpy(zToken, p->u
a4a0: 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  .zToken, nToken)
a4b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
a4c0: 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70   0==((p->flags|p
a4d0: 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28 45  New->flags) & (E
a4e0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
a4f0: 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20 20 2f  eaf)) ){.      /
a500: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
a510: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
a520: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
a530: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
a540: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
a550: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
a560: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
a570: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
a580: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
a590: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  up(db, p->x.pSel
a5a0: 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  ect, dupFlags);.
a5b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a5c0: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
a5d0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
a5e0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78  ListDup(db, p->x
a5f0: 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67 73  .pList, dupFlags
a600: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a610: 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  ..    /* Fill in
a620: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
a630: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
a640: 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  /.    if( ExprHa
a650: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
a660: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
a670: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69 6e 46 75  kenOnly|EP_WinFu
a680: 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c  nc) ){.      zAl
a690: 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72  loc += dupedExpr
a6a0: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46  NodeSize(p, dupF
a6b0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28  lags);.      if(
a6c0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
a6d0: 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e  y(pNew, EP_Token
a6e0: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b  Only|EP_Leaf) ){
a6f0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
a700: 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20  Left = p->pLeft 
a710: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
a720: 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28          exprDup(
a730: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58  db, p->pLeft, EX
a740: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a750: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a760: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
a770: 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20   = p->pRight ?. 
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62        exprDup(db
a7a0: 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50  , p->pRight, EXP
a7b0: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
a7c0: 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20  lloc) : 0;.     
a7d0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
a7e0: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
a7f0: 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  C.      if( Expr
a800: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
a810: 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
a820: 20 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70 57        pNew->y.pW
a830: 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64  in = sqlite3Wind
a840: 6f 77 44 75 70 28 64 62 2c 20 70 4e 65 77 2c 20  owDup(db, pNew, 
a850: 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20  p->y.pWin);.    
a860: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
a870: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
a880: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b  , EP_WinFunc) );
a890: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  .      }.#endif 
a8a0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
a8b0: 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20  INDOWFUNC */.   
a8c0: 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20     if( pzBuffer 
a8d0: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42 75  ){.        *pzBu
a8e0: 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20  ffer = zAlloc;. 
a8f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
a900: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70  {.      if( !Exp
a910: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a920: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a930: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20  Leaf) ){.       
a940: 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d 54   if( pNew->op==T
a950: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
a960: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
a970: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c  w->pLeft = p->pL
a980: 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61  eft;.          a
a990: 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c 75 6d  ssert( p->iColum
a9a0: 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  n==0 || p->pRigh
a9b0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
a9c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
a9d0: 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70 52  ght==0  || p->pR
a9e0: 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74 20 29  ight==p->pLeft )
a9f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
aa00: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
aa10: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
aa20: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
aa30: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
aa40: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77    }.        pNew
aa50: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
aa60: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
aa70: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
aa80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
aa90: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
aaa0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  ./*.** Create an
aab0: 64 20 72 65 74 75 72 6e 20 61 20 64 65 65 70 20  d return a deep 
aac0: 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a 65  copy of the obje
aad0: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
aae0: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75   second .** argu
aaf0: 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  ment. If an OOM 
ab00: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63  condition is enc
ab10: 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69  ountered, NULL i
ab20: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
ab30: 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  d the db->malloc
ab40: 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 2e  Failed flag set.
ab50: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
ab60: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74  TE_OMIT_CTE.stat
ab70: 69 63 20 57 69 74 68 20 2a 77 69 74 68 44 75 70  ic With *withDup
ab80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
ab90: 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a  th *p){.  With *
aba0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRet = 0;.  if( 
abb0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
abc0: 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73  _int64 nByte = s
abd0: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65  izeof(*p) + size
abe0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
abf0: 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70  ->nCte-1);.    p
ac00: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
ac10: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
ac20: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
ac30: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
ac40: 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  i;.      pRet->n
ac50: 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20  Cte = p->nCte;. 
ac60: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ac70: 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  p->nCte; i++){. 
ac80: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
ac90: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
aca0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
acb0: 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74   p->a[i].pSelect
acc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
acd0: 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d  et->a[i].pCols =
ace0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
acf0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
ad00: 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20  pCols, 0);.     
ad10: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e     pRet->a[i].zN
ad20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
ad30: 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  trDup(db, p->a[i
ad40: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
ad50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
ad60: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
ad70: 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68  se.# define with
ad80: 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  Dup(x,y) 0.#endi
ad90: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
ada0: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
adb0: 43 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 61 74 68  C./*.** The gath
adc0: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28  erSelectWindows(
add0: 29 20 70 72 6f 63 65 64 75 72 65 20 61 6e 64 20  ) procedure and 
ade0: 69 74 73 20 68 65 6c 70 65 72 20 72 6f 75 74 69  its helper routi
adf0: 6e 65 0a 2a 2a 20 67 61 74 68 65 72 53 65 6c 65  ne.** gatherSele
ae00: 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63  ctWindowsCallbac
ae10: 6b 28 29 20 61 72 65 20 75 73 65 64 20 74 6f 20  k() are used to 
ae20: 73 63 61 6e 20 61 6c 6c 20 74 68 65 20 65 78 70  scan all the exp
ae30: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 6e 20 61  ressions.** an a
ae40: 20 6e 65 77 6c 79 20 64 75 70 6c 69 63 61 74 65   newly duplicate
ae50: 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
ae60: 6e 74 20 61 6e 64 20 67 61 74 68 65 72 20 61 6c  nt and gather al
ae70: 6c 20 6f 66 20 74 68 65 20 57 69 6e 64 6f 77 0a  l of the Window.
ae80: 2a 2a 20 6f 62 6a 65 63 74 73 20 66 6f 75 6e 64  ** objects found
ae90: 20 74 68 65 72 65 2c 20 61 73 73 65 6d 62 6c 69   there, assembli
aea0: 6e 67 20 74 68 65 6d 20 6f 6e 74 6f 20 74 68 65  ng them onto the
aeb0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 61 74 20   linked list at 
aec0: 53 65 6c 65 63 74 2d 3e 70 57 69 6e 2e 0a 2a 2f  Select->pWin..*/
aed0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 61 74 68  .static int gath
aee0: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 43  erSelectWindowsC
aef0: 61 6c 6c 62 61 63 6b 28 57 61 6c 6b 65 72 20 2a  allback(Walker *
af00: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
af10: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
af20: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pr->op==TK_FUNCT
af30: 49 4f 4e 20 26 26 20 45 78 70 72 48 61 73 50 72  ION && ExprHasPr
af40: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
af50: 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
af60: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
af70: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53   = pWalker->u.pS
af80: 65 6c 65 63 74 3b 0a 20 20 20 20 57 69 6e 64 6f  elect;.    Windo
af90: 77 20 2a 70 57 69 6e 20 3d 20 70 45 78 70 72 2d  w *pWin = pExpr-
afa0: 3e 79 2e 70 57 69 6e 3b 0a 20 20 20 20 61 73 73  >y.pWin;.    ass
afb0: 65 72 74 28 20 70 57 69 6e 20 29 3b 0a 20 20 20  ert( pWin );.   
afc0: 20 61 73 73 65 72 74 28 20 49 73 57 69 6e 64 6f   assert( IsWindo
afd0: 77 46 75 6e 63 28 70 45 78 70 72 29 20 29 3b 0a  wFunc(pExpr) );.
afe0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
aff0: 2d 3e 70 70 54 68 69 73 3d 3d 30 20 29 3b 0a 20  ->ppThis==0 );. 
b000: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
b010: 4c 69 6e 6b 28 70 53 65 6c 65 63 74 2c 20 70 57  Link(pSelect, pW
b020: 69 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  in);.  }.  retur
b030: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
b040: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 67 61 74  }.static int gat
b050: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
b060: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 28 57  SelectCallback(W
b070: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
b080: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 72 65  Select *p){.  re
b090: 74 75 72 6e 20 70 3d 3d 70 57 61 6c 6b 65 72 2d  turn p==pWalker-
b0a0: 3e 75 2e 70 53 65 6c 65 63 74 20 3f 20 57 52 43  >u.pSelect ? WRC
b0b0: 5f 43 6f 6e 74 69 6e 75 65 20 3a 20 57 52 43 5f  _Continue : WRC_
b0c0: 50 72 75 6e 65 3b 0a 7d 0a 73 74 61 74 69 63 20  Prune;.}.static 
b0d0: 76 6f 69 64 20 67 61 74 68 65 72 53 65 6c 65 63  void gatherSelec
b0e0: 74 57 69 6e 64 6f 77 73 28 53 65 6c 65 63 74 20  tWindows(Select 
b0f0: 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  *p){.  Walker w;
b100: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
b110: 63 6b 20 3d 20 67 61 74 68 65 72 53 65 6c 65 63  ck = gatherSelec
b120: 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b  tWindowsCallback
b130: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
b140: 6c 62 61 63 6b 20 3d 20 67 61 74 68 65 72 53 65  lback = gatherSe
b150: 6c 65 63 74 57 69 6e 64 6f 77 73 53 65 6c 65 63  lectWindowsSelec
b160: 74 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78  tCallback;.  w.x
b170: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
b180: 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  = 0;.  w.pParse 
b190: 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 65 6c 65  = 0;.  w.u.pSele
b1a0: 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  ct = p;.  sqlite
b1b0: 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
b1c0: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  p);.}.#endif.../
b1d0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
b1e0: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
b1f0: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
b200: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
b210: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
b220: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
b230: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
b240: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
b250: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
b260: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
b270: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
b280: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
b290: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
b2a0: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
b2b0: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
b2c0: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
b2d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
b2e0: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
b2f0: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
b300: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
b310: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
b320: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
b330: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
b340: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
b350: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
b360: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
b370: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
b380: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
b390: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
b3a0: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
b3b0: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
b3c0: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
b3d0: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
b3e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
b3f0: 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
b400: 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69  ains a combinati
b410: 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55  on of the EXPRDU
b420: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20  P_XXX flags..** 
b430: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
b440: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
b450: 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75  t, then the stru
b460: 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69  cture returned i
b470: 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64  s a.** truncated
b480: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
b490: 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63  usual Expr struc
b4a0: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
b4b0: 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70  e stored as.** p
b4c0: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  art of the in-me
b4d0: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
b4e0: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
b4f0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45  ase schema..*/.E
b500: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
b510: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b520: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
b530: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
b540: 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
b550: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
b560: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20  E );.  return p 
b570: 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c  ? exprDup(db, p,
b580: 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a   flags, 0) : 0;.
b590: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
b5a0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73  te3ExprListDup(s
b5b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
b5c0: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
b5d0: 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  gs){.  ExprList 
b5e0: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
b5f0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
b600: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
b610: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
b620: 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f   *pPriorSelectCo
b630: 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  l = 0;.  assert(
b640: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
b650: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
b660: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
b670: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
b680: 62 2c 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  b, sqlite3DbMall
b690: 6f 63 53 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a  ocSize(db, p));.
b6a0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
b6b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
b6c0: 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78  ->nExpr = p->nEx
b6d0: 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e  pr;.  pItem = pN
b6e0: 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65  ew->a;.  pOldIte
b6f0: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
b700: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
b710: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
b720: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
b730: 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d  Expr *pOldExpr =
b740: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
b750: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
b760: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
b770: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
b780: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
b790: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
b7a0: 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a    if( pOldExpr .
b7b0: 20 20 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72       && pOldExpr
b7c0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
b7d0: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28  COLUMN.     && (
b7e0: 70 4e 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d  pNewExpr = pItem
b7f0: 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20  ->pExpr)!=0 .   
b800: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
b810: 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c  ( pNewExpr->iCol
b820: 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b  umn==0 || i>0 );
b830: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 45  .      if( pNewE
b840: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  xpr->iColumn==0 
b850: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
b860: 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65  t( pOldExpr->pLe
b870: 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52  ft==pOldExpr->pR
b880: 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20  ight );.        
b890: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20  pPriorSelectCol 
b8a0: 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66  = pNewExpr->pLef
b8b0: 74 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52  t = pNewExpr->pR
b8c0: 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ight;.      }els
b8d0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
b8e0: 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( i>0 );.      
b8f0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b    assert( pItem[
b900: 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a  -1].pExpr!=0 );.
b910: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b920: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
b930: 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78  n==pItem[-1].pEx
b940: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b  pr->iColumn+1 );
b950: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b960: 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c   pPriorSelectCol
b970: 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70  ==pItem[-1].pExp
b980: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  r->pLeft );.    
b990: 20 20 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c      pNewExpr->pL
b9a0: 65 66 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65  eft = pPriorSele
b9b0: 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  ctCol;.      }. 
b9c0: 20 20 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e     }.    pItem->
b9d0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
b9e0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
b9f0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
ba00: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
ba10: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
ba20: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
ba30: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
ba40: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 3d 20 70 4f  ->sortFlags = pO
ba50: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 46 6c 61 67  ldItem->sortFlag
ba60: 73 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  s;.    pItem->do
ba70: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
ba80: 6d 2d 3e 62 4e 75 6c 6c 73 20 3d 20 70 4f 6c 64  m->bNulls = pOld
ba90: 49 74 65 6d 2d 3e 62 4e 75 6c 6c 73 3b 0a 20 20  Item->bNulls;.  
baa0: 20 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73    pItem->bSpanIs
bab0: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
bac0: 62 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20  bSpanIsTab;.    
bad0: 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  pItem->bSorterRe
bae0: 66 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53  f = pOldItem->bS
baf0: 6f 72 74 65 72 52 65 66 3b 0a 20 20 20 20 70 49  orterRef;.    pI
bb00: 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65  tem->u = pOldIte
bb10: 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75  m->u;.  }.  retu
bb20: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
bb30: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
bb40: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
bb50: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
bb60: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
bb70: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
bb80: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
bb90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
bba0: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
bbb0: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
bbc0: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
bbd0: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
bbe0: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
bbf0: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
bc00: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
bc10: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
bc20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bc30: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
bc40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
bc50: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
bc60: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bc70: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
bc80: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
bc90: 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  rcListDup(sqlite
bca0: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
bcb0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
bcc0: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
bcd0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
bce0: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
bcf0: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
bd00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bd10: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
bd20: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
bd30: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
bd40: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
bd50: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
bd60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
bd70: 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20  RawNN(db, nByte 
bd80: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
bd90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
bda0: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
bdb0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
bdc0: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
bdd0: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
bde0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
bdf0: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
be00: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
be10: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
be20: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
be30: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
be40: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
be50: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
be60: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
be70: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
be80: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
be90: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
bea0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
beb0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
bec0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
bed0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
bee0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
bef0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
bf00: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
bf10: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
bf20: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
bf30: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
bf40: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
bf50: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
bf60: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
bf70: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
bf80: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
bf90: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
bfa0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
bfb0: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
bfc0: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
bfd0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
bfe0: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
bff0: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
c000: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
c010: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
c020: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
c030: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
c040: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
c050: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
c060: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
c070: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
c080: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
c090: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
c0a0: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
c0b0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
c0c0: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
c0d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c0e0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
c0f0: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
c100: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
c110: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
c120: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
c130: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
c140: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
c150: 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52       pTab->nTabR
c160: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
c170: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
c180: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
c190: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
c1a0: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
c1b0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
c1c0: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
c1d0: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
c1e0: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
c1f0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
c200: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
c210: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
c220: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
c230: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
c240: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
c250: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
c260: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
c270: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
c280: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
c290: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
c2a0: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
c2b0: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  w;.  int i;.  as
c2c0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
c2d0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
c2e0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
c2f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c300: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
c310: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
c320: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
c330: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
c340: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
c350: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
c360: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d  llocRawNN(db, p-
c370: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
c380: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
c390: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
c3a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
c3b0: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
c3c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
c3d0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61  * Note that beca
c3e0: 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  use the size of 
c3f0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
c400: 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74  or p->a[] is not
c410: 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  .  ** necessaril
c420: 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  y a power of two
c430: 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41  , sqlite3IdListA
c440: 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20  ppend() may not 
c450: 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f  be called.  ** o
c460: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
c470: 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20  created by this 
c480: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  function. */.  f
c490: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64  or(i=0; i<p->nId
c4a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
c4b0: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
c4c0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
c4d0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
c4e0: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
c4f0: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
c500: 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  [i];.    pNewIte
c510: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
c520: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
c530: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
c540: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
c550: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
c560: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
c570: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
c580: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
c590: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
c5a0: 65 6c 65 63 74 20 2a 70 44 75 70 2c 20 69 6e 74  elect *pDup, int
c5b0: 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63   flags){.  Selec
c5c0: 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 53  t *pRet = 0;.  S
c5d0: 65 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30  elect *pNext = 0
c5e0: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 2a 70 70 20  ;.  Select **pp 
c5f0: 3d 20 26 70 52 65 74 3b 0a 20 20 53 65 6c 65 63  = &pRet;.  Selec
c600: 74 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  t *p;..  assert(
c610: 20 64 62 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28   db!=0 );.  for(
c620: 70 3d 70 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e  p=pDup; p; p=p->
c630: 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c  pPrior){.    Sel
c640: 65 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  ect *pNew = sqli
c650: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
c660: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20  (db, sizeof(*p) 
c670: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
c680: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
c690: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
c6a0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
c6b0: 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
c6c0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c6d0: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
c6e0: 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20  3SrcListDup(db, 
c6f0: 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b  p->pSrc, flags);
c700: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  .    pNew->pWher
c710: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
c720: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  up(db, p->pWhere
c730: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c740: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  ew->pGroupBy = s
c750: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
c760: 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  p(db, p->pGroupB
c770: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  y, flags);.    p
c780: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  New->pHaving = s
c790: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
c7a0: 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c  , p->pHaving, fl
c7b0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c7c0: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
c7d0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
c7e0: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66  , p->pOrderBy, f
c7f0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lags);.    pNew-
c800: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20  >op = p->op;.   
c810: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
c820: 4e 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Next;.    pNew->
c830: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
c840: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
c850: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
c860: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
c870: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  gs);.    pNew->i
c880: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70  Limit = 0;.    p
c890: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
c8a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46  ;.    pNew->selF
c8b0: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
c8c0: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
c8d0: 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77  emeral;.    pNew
c8e0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
c8f0: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  ] = -1;.    pNew
c900: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
c910: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  ] = -1;.    pNew
c920: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
c930: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
c940: 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20    pNew->pWith = 
c950: 77 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70  withDup(db, p->p
c960: 57 69 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53  With);.#ifndef S
c970: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
c980: 57 46 55 4e 43 0a 20 20 20 20 70 4e 65 77 2d 3e  WFUNC.    pNew->
c990: 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4e  pWin = 0;.    pN
c9a0: 65 77 2d 3e 70 57 69 6e 44 65 66 6e 20 3d 20 73  ew->pWinDefn = s
c9b0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74  qlite3WindowList
c9c0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 6e 44  Dup(db, p->pWinD
c9d0: 65 66 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  efn);.    if( p-
c9e0: 3e 70 57 69 6e 20 26 26 20 64 62 2d 3e 6d 61 6c  >pWin && db->mal
c9f0: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 20 67  locFailed==0 ) g
ca00: 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f  atherSelectWindo
ca10: 77 73 28 70 4e 65 77 29 3b 0a 23 65 6e 64 69 66  ws(pNew);.#endif
ca20: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 49 64  .    pNew->selId
ca30: 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a 20 20 20   = p->selId;.   
ca40: 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20   *pp = pNew;.   
ca50: 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50 72   pp = &pNew->pPr
ca60: 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d  ior;.    pNext =
ca70: 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65   pNew;.  }..  re
ca80: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
ca90: 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  se.Select *sqlit
caa0: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
cab0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
cac0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
cad0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
cae0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
caf0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
cb00: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
cb10: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
cb20: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
cb30: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
cb40: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
cb50: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
cb60: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
cb70: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
cb80: 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20 6d  pList argument m
cb90: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 55  ust be either NU
cba0: 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  LL or a pointer 
cbb0: 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a 2a  to an ExprList.*
cbc0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
cbd0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
cbe0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
cbf0: 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20 72  ppend().  This r
cc00: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e 6f  outine.** may no
cc10: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
cc20: 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61 69  n ExprList obtai
cc30: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
cc40: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a  ExprListDup()..*
cc50: 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73 20  * Reason:  This 
cc60: 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20  routine assumes 
cc70: 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
cc80: 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69 73  of slots in pLis
cc90: 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20 70  t->a[].** is a p
cca0: 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54 68  ower of two.  Th
ccb0: 61 74 20 69 73 20 74 72 75 65 20 66 6f 72 20 73  at is true for s
ccc0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
ccd0: 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a 2a  pend() returns.*
cce0: 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65 63  * but is not nec
ccf0: 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 66 72  essarily true fr
cd00: 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  om the return va
cd10: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45 78  lue of sqlite3Ex
cd20: 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a 0a  prListDup()..**.
cd30: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
cd40: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
cd50: 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69  occurs, the enti
cd60: 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64  re list is freed
cd70: 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20   and.** NULL is 
cd80: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f  returned.  If no
cd90: 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  n-NULL is return
cda0: 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  ed, then it is g
cdb0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61  uaranteed.** tha
cdc0: 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  t the new entry 
cdd0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
cde0: 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78   appended..*/.Ex
cdf0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
ce00: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
ce10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ce20: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
ce30: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ce40: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
ce50: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
ce60: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
ce70: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
ce80: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
ce90: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
cea0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
ceb0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
cec0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
ced0: 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
cee0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
cef0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
cf00: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
cf10: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
cf20: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
cf30: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
cf40: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
cf50: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  NN(db, sizeof(Ex
cf60: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
cf70: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
cf80: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
cf90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
cfa0: 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20  t->nExpr = 0;.  
cfb0: 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74  }else if( (pList
cfc0: 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74  ->nExpr & (pList
cfd0: 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29  ->nExpr-1))==0 )
cfe0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
cff0: 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d  pNew;.    pNew =
d000: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
d010: 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20 20  c(db, pList, .  
d020: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
d030: 4c 69 73 74 29 2b 28 32 2a 28 73 71 6c 69 74 65  List)+(2*(sqlite
d040: 33 5f 69 6e 74 36 34 29 70 4c 69 73 74 2d 3e 6e  3_int64)pList->n
d050: 45 78 70 72 2d 31 29 2a 73 69 7a 65 6f 66 28 70  Expr-1)*sizeof(p
d060: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
d070: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
d080: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
d090: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
d0a0: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
d0b0: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
d0c0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
d0d0: 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ++];.  assert( o
d0e0: 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45  ffsetof(struct E
d0f0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61  xprList_item,zNa
d100: 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49 74 65  me)==sizeof(pIte
d110: 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20 20 61  m->pExpr) );.  a
d120: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
d130: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d140: 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30 20 29  item,pExpr)==0 )
d150: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 49 74 65  ;.  memset(&pIte
d160: 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f  m->zName,0,sizeo
d170: 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73 65 74  f(*pItem)-offset
d180: 6f 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69  of(struct ExprLi
d190: 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b  st_item,zName));
d1a0: 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20  .  pItem->pExpr 
d1b0: 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72  = pExpr;.  retur
d1c0: 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d  n pList;..no_mem
d1d0: 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69  :     .  /* Avoi
d1e0: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
d1f0: 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66   if malloc has f
d200: 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69  ailed. */.  sqli
d210: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
d220: 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  , pExpr);.  sqli
d230: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
d240: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
d250: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d260: 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20  ** pColumns and 
d270: 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65 63  pExpr form a vec
d280: 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20 77  tor assignment w
d290: 68 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 20  hich is part of 
d2a0: 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73  the SET.** claus
d2b0: 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73  e of an UPDATE s
d2c0: 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20  tatement.  Like 
d2d0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
d2e0: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65 78     (a,b,c) = (ex
d2f0: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
d300: 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c  .** Or:    (a,b,
d310: 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c 79  c) = (SELECT x,y
d320: 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a  ,z FROM ....).**
d330: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72  .** For each ter
d340: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  m of the vector 
d350: 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65  assignment, appe
d360: 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74  nd new entries t
d370: 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  o the.** express
d380: 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20  ion list pList. 
d390: 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20   In the case of 
d3a0: 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  a subquery on th
d3b0: 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a  e RHS, append.**
d3c0: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
d3d0: 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a  N expressions..*
d3e0: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
d3f0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
d400: 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73 65  dVector(.  Parse
d410: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d420: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d430: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d440: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
d450: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
d460: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
d470: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
d480: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73  IdList *pColumns
d490: 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ,      /* List o
d4a0: 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f  f names of LHS o
d4b0: 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e 74  f the assignment
d4c0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
d4d0: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
d4e0: 56 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  Vector expressio
d4f0: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
d500: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
d510: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
d520: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d530: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
d540: 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74   i;.  int iFirst
d550: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
d560: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f  ->nExpr : 0;.  /
d570: 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f  * pColumns can o
d580: 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65 20  nly be NULL due 
d590: 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e  to an OOM but an
d5a0: 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20   OOM will cause 
d5b0: 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72 69  an.  ** exit pri
d5c0: 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
d5d0: 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64  ne being invoked
d5e0: 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
d5f0: 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67  pColumns==0) ) g
d600: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
d610: 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70  d_error;.  if( p
d620: 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76  Expr==0 ) goto v
d630: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
d640: 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  or;..  /* If the
d650: 20 52 48 53 20 69 73 20 61 20 76 65 63 74 6f 72   RHS is a vector
d660: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69 6d  , then we can im
d670: 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63 6b 20  mediately check 
d680: 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20 20 2a  to see that .  *
d690: 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * the size of th
d6a0: 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 6d 61  e RHS and LHS ma
d6b0: 74 63 68 2e 20 20 42 75 74 20 69 66 20 74 68 65  tch.  But if the
d6c0: 20 52 48 53 20 69 73 20 61 20 53 45 4c 45 43 54   RHS is a SELECT
d6d0: 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61 72 64  , .  ** wildcard
d6e0: 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65 20 72  s ("*") in the r
d6f0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
d700: 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20   SELECT must be 
d710: 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
d720: 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20 74    ** we can do t
d730: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c 20 73  he size check, s
d740: 6f 20 64 65 66 65 72 20 74 68 65 20 73 69 7a 65  o defer the size
d750: 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64   check until cod
d760: 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20  e generation..  
d770: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
d780: 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op!=TK_SELECT &&
d790: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d   pColumns->nId!=
d7a0: 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65  (n=sqlite3ExprVe
d7b0: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 29  ctorSize(pExpr))
d7c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
d7d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d7e0: 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69  "%d columns assi
d7f0: 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c  gned %d values",
d800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d810: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e       pColumns->n
d820: 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  Id, n);.    goto
d830: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
d840: 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  rror;.  }..  for
d850: 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73  (i=0; i<pColumns
d860: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
d870: 20 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20   Expr *pSubExpr 
d880: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72  = sqlite3ExprFor
d890: 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72  VectorField(pPar
d8a0: 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20  se, pExpr, i);. 
d8b0: 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 45     assert( pSubE
d8c0: 78 70 72 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  xpr!=0 || db->ma
d8d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
d8e0: 20 20 61 73 73 65 72 74 28 20 70 53 75 62 45 78    assert( pSubEx
d8f0: 70 72 3d 3d 30 20 7c 7c 20 70 53 75 62 45 78 70  pr==0 || pSubExp
d900: 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  r->iTable==0 );.
d910: 20 20 20 20 69 66 28 20 70 53 75 62 45 78 70 72      if( pSubExpr
d920: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
d930: 20 20 20 20 70 53 75 62 45 78 70 72 2d 3e 69 54      pSubExpr->iT
d940: 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d  able = pColumns-
d950: 3e 6e 49 64 3b 0a 20 20 20 20 70 4c 69 73 74 20  >nId;.    pList 
d960: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
d970: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
d980: 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72 29  pList, pSubExpr)
d990: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
d9a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d9b0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69   pList->nExpr==i
d9c0: 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20  First+i+1 );.   
d9d0: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73     pList->a[pLis
d9e0: 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  t->nExpr-1].zNam
d9f0: 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b  e = pColumns->a[
da00: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
da10: 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a  pColumns->a[i].z
da20: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Name = 0;.    }.
da30: 20 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e    }..  if( !db->
da40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
da50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
da60: 4c 45 43 54 20 26 26 20 41 4c 57 41 59 53 28 70  LECT && ALWAYS(p
da70: 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
da80: 45 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20 70  Expr *pFirst = p
da90: 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e  List->a[iFirst].
daa0: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
dab0: 74 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b 0a  t( pFirst!=0 );.
dac0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72      assert( pFir
dad0: 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  st->op==TK_SELEC
dae0: 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  T_COLUMN );.    
daf0: 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74   .    /* Store t
db00: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
db10: 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f  ent in pRight so
db20: 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65   it will be dele
db30: 74 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  ted when.    ** 
db40: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
db50: 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65  elete() is calle
db60: 64 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d  d */.    pFirst-
db70: 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b  >pRight = pExpr;
db80: 0a 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a  .    pExpr = 0;.
db90: 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72  .    /* Remember
dba0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
dbb0: 20 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20 73   LHS in iTable s
dbc0: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 68  o that we can ch
dbd0: 65 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  eck that.    ** 
dbe0: 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20  the RHS and LHS 
dbf0: 73 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72 69  sizes match duri
dc00: 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ng code generati
dc10: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72 73  on. */.    pFirs
dc20: 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c  t->iTable = pCol
dc30: 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a  umns->nId;.  }..
dc40: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
dc50: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ror:.  sqlite3Ex
dc60: 70 72 55 6e 6d 61 70 41 6e 64 44 65 6c 65 74 65  prUnmapAndDelete
dc70: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
dc80: 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
dc90: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75  Delete(db, pColu
dca0: 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  mns);.  return p
dcb0: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  List;.}../*.** S
dcc0: 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  et the sort orde
dcd0: 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65  r for the last e
dce0: 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69  lement on the gi
dcf0: 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f  ven ExprList..*/
dd00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
dd10: 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65  rListSetSortOrde
dd20: 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  r(ExprList *p, i
dd30: 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 2c 20 69  nt iSortOrder, i
dd40: 6e 74 20 65 4e 75 6c 6c 73 29 7b 0a 20 20 73 74  nt eNulls){.  st
dd50: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
dd60: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
dd70: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
dd80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78    assert( p->nEx
dd90: 70 72 3e 30 20 29 3b 0a 0a 20 20 61 73 73 65 72  pr>0 );..  asser
dda0: 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44  t( SQLITE_SO_UND
ddb0: 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49  EFINED<0 && SQLI
ddc0: 54 45 5f 53 4f 5f 41 53 43 3d 3d 30 20 26 26 20  TE_SO_ASC==0 && 
ddd0: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30  SQLITE_SO_DESC>0
dde0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
ddf0: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
de00: 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 20 0a 20  _SO_UNDEFINED . 
de10: 20 20 20 20 20 20 7c 7c 20 69 53 6f 72 74 4f 72        || iSortOr
de20: 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  der==SQLITE_SO_A
de30: 53 43 20 0a 20 20 20 20 20 20 20 7c 7c 20 69 53  SC .       || iS
de40: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
de50: 5f 53 4f 5f 44 45 53 43 20 0a 20 20 29 3b 0a 20  _SO_DESC .  );. 
de60: 20 61 73 73 65 72 74 28 20 65 4e 75 6c 6c 73 3d   assert( eNulls=
de70: 3d 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46  =SQLITE_SO_UNDEF
de80: 49 4e 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  INED .       || 
de90: 65 4e 75 6c 6c 73 3d 3d 53 51 4c 49 54 45 5f 53  eNulls==SQLITE_S
dea0: 4f 5f 41 53 43 20 0a 20 20 20 20 20 20 20 7c 7c  O_ASC .       ||
deb0: 20 65 4e 75 6c 6c 73 3d 3d 53 51 4c 49 54 45 5f   eNulls==SQLITE_
dec0: 53 4f 5f 44 45 53 43 20 0a 20 20 29 3b 0a 0a 20  SO_DESC .  );.. 
ded0: 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70   pItem = &p->a[p
dee0: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 61 73  ->nExpr-1];.  as
def0: 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 62 4e 75  sert( pItem->bNu
df00: 6c 6c 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  lls==0 );.  if( 
df10: 69 53 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49  iSortOrder==SQLI
df20: 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 20  TE_SO_UNDEFINED 
df30: 29 7b 0a 20 20 20 20 69 53 6f 72 74 4f 72 64 65  ){.    iSortOrde
df40: 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53  r = SQLITE_SO_AS
df50: 43 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  C;.  }.  pItem->
df60: 73 6f 72 74 46 6c 61 67 73 20 3d 20 28 75 38 29  sortFlags = (u8)
df70: 69 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 69  iSortOrder;..  i
df80: 66 28 20 65 4e 75 6c 6c 73 21 3d 53 51 4c 49 54  f( eNulls!=SQLIT
df90: 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 20 29  E_SO_UNDEFINED )
dfa0: 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 4e 75  {.    pItem->bNu
dfb0: 6c 6c 73 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  lls = 1;.    if(
dfc0: 20 69 53 6f 72 74 4f 72 64 65 72 21 3d 65 4e 75   iSortOrder!=eNu
dfd0: 6c 6c 73 20 29 7b 0a 20 20 20 20 20 20 70 49 74  lls ){.      pIt
dfe0: 65 6d 2d 3e 73 6f 72 74 46 6c 61 67 73 20 7c 3d  em->sortFlags |=
dff0: 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 42   KEYINFO_ORDER_B
e000: 49 47 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  IGNULL;.    }.  
e010: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
e020: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
e030: 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66  zName element of
e040: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e050: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
e060: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
e070: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
e080: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
e090: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
e0a0: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
e0b0: 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76  pName should nev
e0c0: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
e0d0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
e0e0: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
e0f0: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
e100: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
e110: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
e120: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
e130: 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72  stSetName(.  Par
e140: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e150: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e160: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
e170: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
e180: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
e190: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
e1a0: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   span. */.  Toke
e1b0: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
e1c0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62      /* Name to b
e1d0: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
e1e0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
e1f0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
e200: 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74  cause the name t
e210: 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f  o be dequoted */
e220: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  .){.  assert( pL
e230: 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ist!=0 || pParse
e240: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
e250: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
e260: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
e270: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e280: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
e290: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
e2a0: 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  r>0 );.    pItem
e2b0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
e2c0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
e2d0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
e2e0: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20  >zName==0 );.   
e2f0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
e300: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
e310: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
e320: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
e330: 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74  ;.    if( dequot
e340: 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f  e ) sqlite3Dequo
e350: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
e360: 3b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e  ;.    if( IN_REN
e370: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
e380: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
e390: 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
e3a0: 2c 20 28 76 6f 69 64 2a 29 70 49 74 65 6d 2d 3e  , (void*)pItem->
e3b0: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20  zName, pName);. 
e3c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e3d0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
e3e0: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65  st.a[].zSpan ele
e3f0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
e400: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
e410: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
e420: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
e430: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
e440: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
e450: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
e460: 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f  .  But pSpan sho
e470: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
e480: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
e490: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
e4a0: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
e4b0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
e4c0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
e4d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e4e0: 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e  3ExprListSetSpan
e4f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e500: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e510: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e520: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
e530: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
e540: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
e550: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
e560: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e570: 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74  Start,     /* St
e580: 61 72 74 20 6f 66 20 74 68 65 20 73 70 61 6e 20  art of the span 
e590: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e5a0: 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20  *zEnd        /* 
e5b0: 45 6e 64 20 6f 66 20 74 68 65 20 73 70 61 6e 20  End of the span 
e5c0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
e5d0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e5e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
e5f0: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
e600: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
e610: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
e620: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
e630: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
e640: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
e650: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
e660: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
e670: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c  xpr>0 );.    sql
e680: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
e690: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
e6a0: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
e6b0: 20 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75   sqlite3DbSpanDu
e6c0: 70 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45  p(db, zStart, zE
e6d0: 6e 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nd);.  }.}../*.*
e6e0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
e6f0: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
e700: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
e710: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
e720: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
e730: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
e740: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
e750: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e760: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
e770: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
e780: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
e790: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e7a0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
e7b0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
e7c0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
e7d0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
e7e0: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
e7f0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
e800: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
e810: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
e820: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
e830: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
e840: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
e850: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
e860: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e870: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
e880: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
e890: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
e8a0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
e8b0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
e8c0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion list..*/.sta
e8d0: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
e8e0: 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73  INE void exprLis
e8f0: 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  tDeleteNN(sqlite
e900: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
e910: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
e920: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
e930: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
e940: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
e950: 20 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73    pList->a;.  as
e960: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
e970: 70 72 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  pr>0 );.  do{.  
e980: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
e990: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
e9a0: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
e9b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
e9c0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
e9d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e9e0: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
e9f0: 0a 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20  .    pItem++;.  
ea00: 7d 77 68 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b  }while( --i>0 );
ea10: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
ea20: 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
ea30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
ea40: 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  rListDelete(sqli
ea50: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
ea60: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28  t *pList){.  if(
ea70: 20 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73   pList ) exprLis
ea80: 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c  tDeleteNN(db, pL
ea90: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
eaa0: 65 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73  eturn the bitwis
eab0: 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72  e-OR of all Expr
eac0: 2e 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e  .flags fields in
ead0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78   the given.** Ex
eae0: 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73  prList..*/.u32 s
eaf0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
eb00: 61 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69  ags(const ExprLi
eb10: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
eb20: 74 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30  t i;.  u32 m = 0
eb30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
eb40: 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  t!=0 );.  for(i=
eb50: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
eb60: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 45 78  r; i++){.     Ex
eb70: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
eb80: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
eb90: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
eba0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 6d 20 7c  r!=0 );.     m |
ebb0: 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a  = pExpr->flags;.
ebc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a    }.  return m;.
ebd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
ebe0: 20 61 20 53 45 4c 45 43 54 2d 6e 6f 64 65 20 63   a SELECT-node c
ebf0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
ec00: 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65  expression walke
ec10: 72 20 74 68 61 74 0a 2a 2a 20 61 6c 77 61 79 73  r that.** always
ec20: 20 22 66 61 69 6c 73 22 2e 20 20 42 79 20 22 66   "fails".  By "f
ec30: 61 69 6c 22 20 69 6e 20 74 68 69 73 20 63 61 73  ail" in this cas
ec40: 65 2c 20 77 65 20 6d 65 61 6e 20 73 65 74 0a 2a  e, we mean set.*
ec50: 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  * pWalker->eCode
ec60: 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 61 62 6f   to zero and abo
ec70: 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  rt..**.** This c
ec80: 61 6c 6c 62 61 63 6b 20 69 73 20 75 73 65 64 20  allback is used 
ec90: 62 79 20 6d 75 6c 74 69 70 6c 65 20 65 78 70 72  by multiple expr
eca0: 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72 73 2e 0a  ession walkers..
ecb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
ecc0: 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28 57 61 6c  lectWalkFail(Wal
ecd0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
ece0: 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  lect *NotUsed){.
ecf0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
ed00: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70  ER(NotUsed);.  p
ed10: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
ed20: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
ed30: 41 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Abort;.}../*.** 
ed40: 49 66 20 74 68 65 20 69 6e 70 75 74 20 65 78 70  If the input exp
ed50: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 49 44  ression is an ID
ed60: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 22   with the name "
ed70: 74 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22  true" or "false"
ed80: 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  .** then convert
ed90: 20 69 74 20 69 6e 74 6f 20 61 6e 20 54 4b 5f 54   it into an TK_T
eda0: 52 55 45 46 41 4c 53 45 20 74 65 72 6d 2e 20 20  RUEFALSE term.  
edb0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
edc0: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 76 65 72  if.** the conver
edd0: 73 69 6f 6e 20 68 61 70 70 65 6e 65 64 2c 20 61  sion happened, a
ede0: 6e 64 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  nd zero if the e
edf0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 61  xpression is una
ee00: 6c 74 65 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ltered..*/.int s
ee10: 71 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72  qlite3ExprIdToTr
ee20: 75 65 46 61 6c 73 65 28 45 78 70 72 20 2a 70 45  ueFalse(Expr *pE
ee30: 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  xpr){.  assert( 
ee40: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pExpr->op==TK_ID
ee50: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
ee60: 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 69 66  K_STRING );.  if
ee70: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
ee80: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 51 75 6f  ty(pExpr, EP_Quo
ee90: 74 65 64 29 0a 20 20 20 26 26 20 28 73 71 6c 69  ted).   && (sqli
eea0: 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
eeb0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 74 72 75  ->u.zToken, "tru
eec0: 65 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  e")==0.       ||
eed0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
eee0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
eef0: 20 22 66 61 6c 73 65 22 29 3d 3d 30 29 0a 20 20   "false")==0).  
ef00: 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  ){.    pExpr->op
ef10: 20 3d 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3b   = TK_TRUEFALSE;
ef20: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
ef30: 65 72 74 79 28 70 45 78 70 72 2c 20 70 45 78 70  erty(pExpr, pExp
ef40: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d  r->u.zToken[4]==
ef50: 30 20 3f 20 45 50 5f 49 73 54 72 75 65 20 3a 20  0 ? EP_IsTrue : 
ef60: 45 50 5f 49 73 46 61 6c 73 65 29 3b 0a 20 20 20  EP_IsFalse);.   
ef70: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
ef80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
ef90: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
efa0: 20 6d 75 73 74 20 62 65 20 61 20 54 4b 5f 54 52   must be a TK_TR
efb0: 55 45 46 41 4c 53 45 20 45 78 70 72 20 6e 6f 64  UEFALSE Expr nod
efc0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
efd0: 69 74 20 69 73 20 54 52 55 45 0a 2a 2a 20 61 6e  it is TRUE.** an
efe0: 64 20 30 20 69 66 20 69 74 20 69 73 20 46 41 4c  d 0 if it is FAL
eff0: 53 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  SE..*/.int sqlit
f000: 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
f010: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78  (const Expr *pEx
f020: 70 72 29 7b 0a 20 20 70 45 78 70 72 20 3d 20 73  pr){.  pExpr = s
f030: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
f040: 6c 6c 61 74 65 28 28 45 78 70 72 2a 29 70 45 78  llate((Expr*)pEx
f050: 70 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pr);.  assert( p
f060: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55  Expr->op==TK_TRU
f070: 45 46 41 4c 53 45 20 29 3b 0a 20 20 61 73 73 65  EFALSE );.  asse
f080: 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  rt( sqlite3StrIC
f090: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
f0a0: 65 6e 2c 22 74 72 75 65 22 29 3d 3d 30 0a 20 20  en,"true")==0.  
f0b0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53       || sqlite3S
f0c0: 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
f0d0: 7a 54 6f 6b 65 6e 2c 22 66 61 6c 73 65 22 29 3d  zToken,"false")=
f0e0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
f0f0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34  Expr->u.zToken[4
f100: 5d 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ]==0;.}../*.** I
f110: 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 41 4e  f pExpr is an AN
f120: 44 20 6f 72 20 4f 52 20 65 78 70 72 65 73 73 69  D or OR expressi
f130: 6f 6e 2c 20 74 72 79 20 74 6f 20 73 69 6d 70 6c  on, try to simpl
f140: 69 66 79 20 69 74 20 62 79 20 65 6c 69 6d 69 6e  ify it by elimin
f150: 61 74 69 6e 67 0a 2a 2a 20 74 65 72 6d 73 20 74  ating.** terms t
f160: 68 61 74 20 61 72 65 20 61 6c 77 61 79 73 20 74  hat are always t
f170: 72 75 65 20 6f 72 20 66 61 6c 73 65 2e 20 20 52  rue or false.  R
f180: 65 74 75 72 6e 20 74 68 65 20 73 69 6d 70 6c 69  eturn the simpli
f190: 66 69 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e  fied expression.
f1a0: 0a 2a 2a 20 4f 72 20 72 65 74 75 72 6e 20 74 68  .** Or return th
f1b0: 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65  e original expre
f1c0: 73 73 69 6f 6e 20 69 66 20 6e 6f 20 73 69 6d 70  ssion if no simp
f1d0: 6c 69 66 69 63 61 74 69 6f 6e 20 69 73 20 70 6f  lification is po
f1e0: 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  ssible..**.** Ex
f1f0: 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
f200: 20 20 28 78 3c 31 30 29 20 41 4e 44 20 74 72 75    (x<10) AND tru
f210: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
f220: 20 3d 3e 20 20 20 28 78 3c 31 30 29 0a 2a 2a 20   =>   (x<10).** 
f230: 20 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20 66      (x<10) AND f
f240: 61 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  alse            
f250: 20 20 20 3d 3e 20 20 20 66 61 6c 73 65 0a 2a 2a     =>   false.**
f260: 20 20 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20       (x<10) AND 
f270: 28 79 3d 32 32 20 4f 52 20 66 61 6c 73 65 29 20  (y=22 OR false) 
f280: 20 20 20 20 3d 3e 20 20 20 28 78 3c 31 30 29 20      =>   (x<10) 
f290: 41 4e 44 20 28 79 3d 32 32 29 0a 2a 2a 20 20 20  AND (y=22).**   
f2a0: 20 20 28 78 3c 31 30 29 20 41 4e 44 20 28 79 3d    (x<10) AND (y=
f2b0: 32 32 20 4f 52 20 74 72 75 65 29 20 20 20 20 20  22 OR true)     
f2c0: 20 3d 3e 20 20 20 28 78 3c 31 30 29 0a 2a 2a 20   =>   (x<10).** 
f2d0: 20 20 20 20 28 79 3d 32 32 29 20 4f 52 20 74 72      (y=22) OR tr
f2e0: 75 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ue              
f2f0: 20 20 20 3d 3e 20 20 20 74 72 75 65 0a 2a 2f 0a     =>   true.*/.
f300: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
f310: 72 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72  rSimplifiedAndOr
f320: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
f330: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d   assert( pExpr!=
f340: 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  0 );.  if( pExpr
f350: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 7c 7c 20  ->op==TK_AND || 
f360: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
f370: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52   ){.    Expr *pR
f380: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
f390: 70 72 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f  prSimplifiedAndO
f3a0: 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  r(pExpr->pRight)
f3b0: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  ;.    Expr *pLef
f3c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
f3d0: 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72 28 70  implifiedAndOr(p
f3e0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
f3f0: 20 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73    if( ExprAlways
f400: 54 72 75 65 28 70 4c 65 66 74 29 20 7c 7c 20 45  True(pLeft) || E
f410: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
f420: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
f430: 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 6f  pExpr = pExpr->o
f440: 70 3d 3d 54 4b 5f 41 4e 44 20 3f 20 70 52 69 67  p==TK_AND ? pRig
f450: 68 74 20 3a 20 70 4c 65 66 74 3b 0a 20 20 20 20  ht : pLeft;.    
f460: 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 41 6c  }else if( ExprAl
f470: 77 61 79 73 54 72 75 65 28 70 52 69 67 68 74 29  waysTrue(pRight)
f480: 20 7c 7c 20 45 78 70 72 41 6c 77 61 79 73 46 61   || ExprAlwaysFa
f490: 6c 73 65 28 70 4c 65 66 74 29 20 29 7b 0a 20 20  lse(pLeft) ){.  
f4a0: 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70      pExpr = pExp
f4b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 3f 20  r->op==TK_AND ? 
f4c0: 70 4c 65 66 74 20 3a 20 70 52 69 67 68 74 3b 0a  pLeft : pRight;.
f4d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
f4e0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 0a 2f 2a  rn pExpr;.}.../*
f4f0: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
f500: 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61  es are Walker ca
f510: 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20  llbacks used to 
f520: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
f530: 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74  s to.** see if t
f540: 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e  hey are "constan
f550: 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69  t" for some defi
f560: 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61  nition of consta
f570: 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b  nt.  The.** Walk
f580: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64  er.eCode value d
f590: 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79  etermines the ty
f5a0: 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22  pe of "constant"
f5b0: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a   we are looking.
f5c0: 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ** for..**.** Th
f5d0: 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ese callback rou
f5e0: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
f5f0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
f600: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
f610: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f620: 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  IsConstant()    
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
f640: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a  alker->eCode==1.
f650: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
f660: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
f670: 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20  oin()           
f680: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
f690: 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  2.**     sqlite3
f6a0: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
f6b0: 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20  ant()           
f6c0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
f6d0: 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ==3.**     sqlit
f6e0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
f6f0: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20  OrFunction()    
f700: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
f710: 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a  de==4 or 5.**.**
f720: 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74   In all cases, t
f730: 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74  he callbacks set
f740: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20   Walker.eCode=0 
f750: 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65  and abort if the
f760: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
f770: 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62  s found to not b
f780: 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a  e a constant..**
f790: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
f7a0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
f7b0: 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65  unction() is use
f7c0: 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  d for evaluating
f7d0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
f7e0: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
f7f0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
f800: 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76  e Walker.eCode v
f810: 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70  alue is 5 when p
f820: 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69  arsing.** an exi
f830: 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64  sting schema and
f840: 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69   4 when processi
f850: 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65  ng a new stateme
f860: 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20  nt.  A bound.** 
f870: 70 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73  parameter raises
f880: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65   an error for ne
f890: 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75  w statements, bu
f8a0: 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f  t is silently co
f8b0: 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55  nverted.** to NU
f8c0: 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  LL for existing 
f8d0: 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61  schemas.  This a
f8e0: 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73  llows sqlite_mas
f8f0: 74 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20  ter tables that 
f900: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f  .** contain a bo
f910: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65  und parameter be
f920: 63 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20  cause they were 
f930: 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64  generated by old
f940: 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  er versions.** o
f950: 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70  f SQLite to be p
f960: 61 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76  arsed by newer v
f970: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
f980: 65 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e  e without raisin
f990: 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  g a.** malformed
f9a0: 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a   schema error..*
f9b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
f9c0: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
f9d0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
f9e0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a   Expr *pExpr){..
f9f0: 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d    /* If pWalker-
fa00: 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e  >eCode is 2 then
fa10: 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65   any term of the
fa20: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
fa30: 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a   comes from.  **
fa40: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
fa50: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65   clauses of a le
fa60: 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69  ft join disquali
fa70: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
fa80: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
fa90: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
faa0: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
fab0: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
fac0: 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72  ==2 && ExprHasPr
fad0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
fae0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
faf0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
fb00: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
fb10: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
fb20: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
fb30: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ->op ){.    /* C
fb40: 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e  onsider function
fb50: 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  s to be constant
fb60: 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72   if all their ar
fb70: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73  guments are cons
fb80: 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  tant.    ** and 
fb90: 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e  either pWalker->
fba0: 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72  eCode==4 or 5 or
fbb0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61   the function ha
fbc0: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c  s the.    ** SQL
fbd0: 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66  ITE_FUNC_CONST f
fbe0: 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65  lag. */.    case
fbf0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
fc00: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
fc10: 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70  >eCode>=4 || Exp
fc20: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
fc30: 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29  pr,EP_ConstFunc)
fc40: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
fc50: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
fc60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fc70: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
fc80: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
fc90: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
fca0: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
fcb0: 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20  case TK_ID:.    
fcc0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 74 72    /* Convert "tr
fcd0: 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22 20 69  ue" or "false" i
fce0: 6e 20 61 20 44 45 46 41 55 4c 54 20 63 6c 61 75  n a DEFAULT clau
fcf0: 73 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  se into the.    
fd00: 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65    ** appropriate
fd10: 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 6f 70   TK_TRUEFALSE op
fd20: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
fd30: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
fd40: 64 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45 78  dToTrueFalse(pEx
fd50: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pr) ){.        r
fd60: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
fd70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
fd80: 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
fd90: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
fda0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
fdb0: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
fdc0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
fdd0: 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63  UMN:.      testc
fde0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
fdf0: 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74  TK_ID );.      t
fe00: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
fe10: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
fe20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fe30: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
fe40: 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
fe50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
fe60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
fe70: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
fe80: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
fe90: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
fea0: 69 78 65 64 43 6f 6c 29 20 26 26 20 70 57 61 6c  ixedCol) && pWal
feb0: 6b 65 72 2d 3e 65 43 6f 64 65 21 3d 32 20 29 7b  ker->eCode!=2 ){
fec0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fed0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
fee0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
fef0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
ff00: 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  3 && pExpr->iTab
ff10: 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  le==pWalker->u.i
ff20: 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Cur ){.        r
ff30: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
ff40: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
ff50: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
ff60: 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  h */.    case TK
ff70: 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a 20 20  _IF_NULL_ROW:.  
ff80: 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
ff90: 45 52 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  ER:.      testca
ffa0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
ffb0: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
ffc0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
ffd0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e  xpr->op==TK_IF_N
ffe0: 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20 20 20  ULL_ROW );.     
fff0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
10000 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
10010 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
10020 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
10030 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  E:.      if( pWa
10040 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29  lker->eCode==5 )
10050 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c  {.        /* Sil
10060 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f  ently convert bo
10070 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 74  und parameters t
10080 68 61 74 20 61 70 70 65 61 72 20 69 6e 73 69 64  hat appear insid
10090 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20  e of CREATE.    
100a0 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
100b0 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68  s into a NULL wh
100c0 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20 43  en parsing the C
100d0 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
100e0 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20  text out.       
100f0 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74   ** of the sqlit
10100 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e_master table *
10110 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  /.        pExpr-
10120 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
10130 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
10140 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
10150 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
10160 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
10170 20 69 6e 20 61 20 43 52 45 41 54 45 20 73 74 61   in a CREATE sta
10180 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67  tement that orig
10190 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20  inates from.    
101a0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70      ** sqlite3_p
101b0 72 65 70 61 72 65 28 29 20 63 61 75 73 65 73 20  repare() causes 
101c0 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
101d0 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
101e0 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
101f0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
10200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10210 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
10220 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  */.    default:.
10230 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10240 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
10250 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71 6c 69 74  LECT ); /* sqlit
10260 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
10270 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f 0a  () disallows */.
10280 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10290 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
102a0 49 53 54 53 20 29 3b 20 2f 2a 20 73 71 6c 69 74  ISTS ); /* sqlit
102b0 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
102c0 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f 0a  () disallows */.
102d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
102e0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
102f0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
10300 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
10310 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69   int initFlag, i
10320 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b  nt iCur){.  Walk
10330 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
10340 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e  = initFlag;.  w.
10350 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
10360 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
10370 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  nt;.  w.xSelectC
10380 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
10390 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b  3SelectWalkFail;
103a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
103b0 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74  EBUG.  w.xSelect
103c0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69  Callback2 = sqli
103d0 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73  te3SelectWalkAss
103e0 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 77  ert2;.#endif.  w
103f0 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  .u.iCur = iCur;.
10400 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
10410 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
10420 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
10430 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
10440 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
10450 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
10460 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10470 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
10480 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
10490 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
104a0 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
104b0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
104c0 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
104d0 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
104e0 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
104f0 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
10500 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
10510 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
10520 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
10530 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
10540 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
10550 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
10560 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
10570 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
10580 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
10590 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 1, 0);.}../*.*
105a0 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
105b0 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
105c0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a  rn non-zero if.*
105d0 2a 0a 2a 2a 20 20 20 28 31 29 20 74 68 65 20 65  *.**   (1) the e
105e0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
105f0 73 74 61 6e 74 2c 20 61 6e 64 0a 2a 2a 20 20 20  stant, and.**   
10600 28 32 29 20 74 68 65 20 65 78 70 72 65 73 73 69  (2) the expressi
10610 6f 6e 20 64 6f 65 73 20 6f 72 69 67 69 6e 61 74  on does originat
10620 65 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  e in the ON or U
10630 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20  SING clause.**  
10640 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a       of a LEFT J
10650 4f 49 4e 2c 20 61 6e 64 0a 2a 2a 20 20 20 28 33  OIN, and.**   (3
10660 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  ) the expression
10670 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
10680 6e 20 61 6e 79 20 45 50 5f 46 69 78 65 64 43 6f  n any EP_FixedCo
10690 6c 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 20  l TK_COLUMN.**  
106a0 20 20 20 20 20 6f 70 65 72 61 6e 64 73 20 63 72       operands cr
106b0 65 61 74 65 64 20 62 79 20 74 68 65 20 63 6f 6e  eated by the con
106c0 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f  stant propagatio
106d0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  n optimization..
106e0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
106f0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
10700 74 72 75 65 2c 20 69 74 20 69 6e 64 69 63 61 74  true, it indicat
10710 65 73 20 74 68 61 74 20 74 68 65 20 65 78 70 72  es that the expr
10720 65 73 73 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  ession.** can be
10730 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50   added to the pP
10740 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
10750 20 6c 69 73 74 20 61 6e 64 20 65 76 61 6c 75 61   list and evalua
10760 74 65 64 20 6f 6e 63 65 20 77 68 65 6e 0a 2a 2a  ted once when.**
10770 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
10780 61 74 65 6d 65 6e 74 20 73 74 61 72 74 73 20 75  atement starts u
10790 70 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  p.  See sqlite3E
107a0 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 29 2e  xprCodeAtInit().
107b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
107c0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
107d0 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
107e0 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
107f0 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a  nst(p, 2, 0);.}.
10800 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
10810 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
10820 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
10830 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
10840 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
10850 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65  * for any single
10860 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c   row of the tabl
10870 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43  e with cursor iC
10880 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ur.  In other wo
10890 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72  rds, the.** expr
108a0 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20  ession must not 
108b0 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e  refer to any non
108c0 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66  -deterministic f
108d0 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a  unction nor any.
108e0 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74  ** table other t
108f0 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74  han iCur..*/.int
10900 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
10910 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  bleConstant(Expr
10920 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a   *p, int iCur){.
10930 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
10940 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72 29  onst(p, 3, iCur)
10950 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  ;.}.../*.** sqli
10960 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61  te3WalkExpr() ca
10970 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 73  llback used by s
10980 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
10990 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 29 2e  tantOrGroupBy().
109a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
109b0 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
109c0 74 4f 72 47 72 6f 75 70 42 79 28 57 61 6c 6b 65  tOrGroupBy(Walke
109d0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
109e0 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72   *pExpr){.  Expr
109f0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20 3d  List *pGroupBy =
10a00 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 47 72 6f   pWalker->u.pGro
10a10 75 70 42 79 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  upBy;.  int i;..
10a20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45    /* Check if pE
10a30 78 70 72 20 69 73 20 69 64 65 6e 74 69 63 61 6c  xpr is identical
10a40 20 74 6f 20 61 6e 79 20 47 52 4f 55 50 20 42 59   to any GROUP BY
10a50 20 74 65 72 6d 2e 20 49 66 20 73 6f 2c 20 63 6f   term. If so, co
10a60 6e 73 69 64 65 72 0a 20 20 2a 2a 20 69 74 20 63  nsider.  ** it c
10a70 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a 20 20 66  onstant.  */.  f
10a80 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
10a90 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
10aa0 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
10ab0 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
10ac0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  xpr;.    if( sql
10ad0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
10ae0 30 2c 20 70 45 78 70 72 2c 20 70 2c 20 2d 31 29  0, pExpr, p, -1)
10af0 3c 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  <2 ){.      Coll
10b00 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
10b10 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
10b20 71 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  q(pWalker->pPars
10b30 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28  e, p);.      if(
10b40 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72 79   sqlite3IsBinary
10b50 28 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20  (pColl) ){.     
10b60 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
10b70 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  une;.      }.   
10b80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
10b90 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ck if pExpr is a
10ba0 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 66 20   sub-select. If 
10bb0 73 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69 74 20  so, consider it 
10bc0 76 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20 69  variable. */.  i
10bd0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
10be0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
10bf0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70  Select) ){.    p
10c00 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
10c10 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  0;.    return WR
10c20 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
10c30 72 65 74 75 72 6e 20 65 78 70 72 4e 6f 64 65 49  return exprNodeI
10c40 73 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b 65  sConstant(pWalke
10c50 72 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  r, pExpr);.}../*
10c60 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65 78 70  .** Walk the exp
10c70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 70 61 73  ression tree pas
10c80 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
10c90 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72   argument. Retur
10ca0 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 66  n non-zero.** if
10cb0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10cc0 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
10cd0 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 6f  y of constants o
10ce0 72 20 63 6f 70 69 65 73 20 6f 66 20 74 65 72 6d  r copies of term
10cf0 73 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70 42  s .** in pGroupB
10d00 79 20 74 68 61 74 20 73 6f 72 74 20 77 69 74 68  y that sort with
10d10 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c   the BINARY coll
10d20 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
10d30 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
10d40 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
10d50 74 65 72 6d 69 6e 65 20 69 66 20 61 20 74 65 72  termine if a ter
10d60 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20  m of the HAVING 
10d70 63 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62 65  clause can.** be
10d80 20 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20 74   promoted into t
10d90 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
10da0 20 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 73    In order for s
10db0 75 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e 20  uch a promotion 
10dc0 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65 20  to work,.** the 
10dd0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 48 41 56  value of the HAV
10de0 49 4e 47 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ING clause term 
10df0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
10e00 20 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72 73   for all members
10e10 20 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70 22   of.** a "group"
10e20 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d 65  .  The requireme
10e30 6e 74 20 74 68 61 74 20 74 68 65 20 47 52 4f 55  nt that the GROU
10e40 50 20 42 59 20 74 65 72 6d 20 6d 75 73 74 20 62  P BY term must b
10e50 65 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73 75  e BINARY.** assu
10e60 6d 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  mes that no othe
10e70 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  r collating sequ
10e80 65 6e 63 65 20 77 69 6c 6c 20 68 61 76 65 20 61  ence will have a
10e90 20 66 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a 2a   finer-grained.*
10ea0 2a 20 67 72 6f 75 70 69 6e 67 20 74 68 61 6e 20  * grouping than 
10eb0 62 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68 65  binary.  In othe
10ec0 72 20 77 6f 72 64 73 20 28 41 3d 42 20 43 4f 4c  r words (A=B COL
10ed0 4c 41 54 45 20 62 69 6e 61 72 79 29 20 69 6d 70  LATE binary) imp
10ee0 6c 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20 65  lies.** A=B in e
10ef0 76 65 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c 61  very other colla
10f00 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20  ting sequence.  
10f10 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  The requirement 
10f20 74 68 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f 55  that the.** GROU
10f30 50 20 42 59 20 62 65 20 42 49 4e 41 52 59 20 69  P BY be BINARY i
10f40 73 20 73 74 72 69 63 74 65 72 20 74 68 61 6e 20  s stricter than 
10f50 6e 65 63 65 73 73 61 72 79 2e 20 20 49 74 20 77  necessary.  It w
10f60 6f 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a 2a  ould also work.*
10f70 2a 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41 56  * to promote HAV
10f80 49 4e 47 20 63 6c 61 75 73 65 73 20 74 68 61 74  ING clauses that
10f90 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 61 6c   use the same al
10fa0 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
10fb0 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
10fc0 61 73 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  as the GROUP BY 
10fd0 74 65 72 6d 2c 20 62 75 74 20 74 68 61 74 20 69  term, but that i
10fe0 73 20 6d 75 63 68 20 68 61 72 64 65 72 20 74 6f  s much harder to
10ff0 20 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65 72   check,.** alter
11000 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67  native collating
11010 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 75   sequences are u
11020 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68 69  ncommon, and thi
11030 73 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a 20  s is only an.** 
11040 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73 6f  optimization, so
11050 20 77 65 20 74 61 6b 65 20 74 68 65 20 65 61 73   we take the eas
11060 79 20 77 61 79 20 6f 75 74 20 61 6e 64 20 73 69  y way out and si
11070 6d 70 6c 79 20 72 65 71 75 69 72 65 20 74 68 65  mply require the
11080 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 74 6f 20  .** GROUP BY to 
11090 75 73 65 20 74 68 65 20 42 49 4e 41 52 59 20 63  use the BINARY c
110a0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
110b0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
110c0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
110d0 72 47 72 6f 75 70 42 79 28 50 61 72 73 65 20 2a  rGroupBy(Parse *
110e0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c  pParse, Expr *p,
110f0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
11100 70 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  pBy){.  Walker w
11110 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b  ;.  w.eCode = 1;
11120 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
11130 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43  ck = exprNodeIsC
11140 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79  onstantOrGroupBy
11150 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
11160 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75  lback = 0;.  w.u
11170 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
11180 75 70 42 79 3b 0a 20 20 77 2e 70 50 61 72 73 65  upBy;.  w.pParse
11190 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
111a0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
111b0 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
111c0 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
111d0 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
111e0 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
111f0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
11200 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
11210 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
11220 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
11230 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
11240 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
11250 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
11260 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
11270 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
11280 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
11290 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
112a0 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
112b0 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
112c0 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
112d0 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
112e0 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
112f0 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
11300 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
11310 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
11320 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
11330 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
11340 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b   *p, u8 isInit){
11350 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69  .  assert( isIni
11360 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d  t==0 || isInit==
11370 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78  1 );.  return ex
11380 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69  prIsConst(p, 4+i
11390 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69  sInit, 0);.}..#i
113a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
113b0 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
113c0 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
113d0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
113e0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
113f0 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
11400 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72  ins a.** subquer
11410 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20  y of some kind. 
11420 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
11430 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65  re are no subque
11440 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ries..*/.int sql
11450 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73  ite3ExprContains
11460 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70  Subquery(Expr *p
11470 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
11480 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20   w.eCode = 1;.  
11490 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
114a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  = sqlite3ExprWal
114b0 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65  kNoop;.  w.xSele
114c0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ctCallback = sql
114d0 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
114e0 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  il;.#ifdef SQLIT
114f0 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c  E_DEBUG.  w.xSel
11500 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
11510 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
11520 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a  Assert2;.#endif.
11530 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
11540 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
11550 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d  rn w.eCode==0;.}
11560 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
11570 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
11580 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74   p codes a const
11590 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74  ant integer that
115a0 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
115b0 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
115c0 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
115d0 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74  return 1 and put
115e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
115f0 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20  e integer.** in 
11600 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65  *pValue.  If the
11610 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
11620 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  ot an integer or
11630 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69   if it is too bi
11640 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  g.** to fit in a
11650 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69   signed 32-bit i
11660 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30  nteger, return 0
11670 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c   and leave *pVal
11680 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ue unchanged..*/
11690 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
116a0 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a  IsInteger(Expr *
116b0 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b  p, int *pValue){
116c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
116d0 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
116e0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
116f0 20 55 73 65 64 20 74 6f 20 6f 6e 6c 79 20 68 61   Used to only ha
11700 70 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f  ppen following o
11710 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49  n OOM */..  /* I
11720 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
11730 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69  is an integer li
11740 74 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20  teral that fits 
11750 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
11760 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c  it.  ** integer,
11770 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74   then the EP_Int
11780 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20  Value flag will 
11790 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
117a0 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72  n set */.  asser
117b0 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54  t( p->op!=TK_INT
117c0 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67  EGER || (p->flag
117d0 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  s & EP_IntValue)
117e0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  !=0.           |
117f0 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
11800 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26  2(p->u.zToken, &
11810 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  rc)==0 );..  if(
11820 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49   p->flags & EP_I
11830 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a  ntValue ){.    *
11840 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56  pValue = p->u.iV
11850 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  alue;.    return
11860 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68   1;.  }.  switch
11870 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
11880 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
11890 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
118a0 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
118b0 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65  p->pLeft, pValue
118c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
118d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
118e0 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
118f0 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69    int v;.      i
11900 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
11910 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
11920 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20  , &v) ){.       
11930 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31   assert( v!=(-21
11940 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20  47483647-1) );. 
11950 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d         *pValue =
11960 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20   -v;.        rc 
11970 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
11980 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11990 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
119a0 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
119b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
119c0 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
119d0 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
119e0 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
119f0 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c  sion can be NULL
11a00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
11a10 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
11a20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68  be NULL or if th
11a30 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
11a40 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74  too complex.** t
11a50 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52  o tell return TR
11a60 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  UE.  .**.** This
11a70 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
11a80 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   as an optimizat
11a90 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f  ion, to skip OP_
11aa0 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  IsNull opcodes.*
11ab0 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74  * when we know t
11ac0 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e  hat a value cann
11ad0 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e  ot be NULL.  Hen
11ae0 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69  ce, a false posi
11af0 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69  tive.** (returni
11b00 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20  ng TRUE when in 
11b10 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73  fact the express
11b20 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65  ion can never be
11b30 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20   NULL) might.** 
11b40 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f  be a small perfo
11b50 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69  rmance hit but i
11b60 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d  s otherwise harm
11b70 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74  less.  On the ot
11b80 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66  her.** hand, a f
11b90 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72  alse negative (r
11ba0 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77  eturning FALSE w
11bb0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
11bc0 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a  ould be NULL).**
11bd0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73   will likely res
11be0 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72  ult in an incorr
11bf0 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20  ect answer.  So 
11c00 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  when in doubt, r
11c10 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a  eturn.** TRUE..*
11c20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
11c30 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74  rCanBeNull(const
11c40 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20   Expr *p){.  u8 
11c50 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  op;.  while( p->
11c60 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
11c70 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
11c80 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   ){.    p = p->p
11c90 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d  Left;.  }.  op =
11ca0 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
11cb0 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
11cc0 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
11cd0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
11ce0 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
11cf0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
11d00 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
11d10 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
11d20 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  e TK_BLOB:.     
11d30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63   return 0;.    c
11d40 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
11d50 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72       return Expr
11d60 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
11d70 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a  P_CanBeNull) ||.
11d80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
11d90 79 2e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a  y.pTab==0 ||  /*
11da0 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f   Reference to co
11db0 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e  lumn of index on
11dc0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e              (p->
11de0 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d  iColumn>=0 && p-
11df0 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d  >y.pTab->aCol[p-
11e00 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  >iColumn].notNul
11e10 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75  l==0);.    defau
11e20 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
11e30 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
11e40 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
11e50 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
11e60 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61  sion is a consta
11e70 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  nt which would b
11e80 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62  e.** unchanged b
11e90 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69  y OP_Affinity wi
11ea0 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  th the affinity 
11eb0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
11ec0 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ond.** argument.
11ed0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11ee0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
11ef0 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
11f00 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72  OP_Affinity oper
11f10 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
11f20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69  omitted.  When i
11f30 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46  n doubt return F
11f40 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e  ALSE.  A false n
11f50 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61  egative.** is ha
11f60 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65  rmless.  A false
11f70 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76   positive, howev
11f80 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69  er, can result i
11f90 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61  n the wrong.** a
11fa0 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nswer..*/.int sq
11fb0 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
11fc0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63  AffinityChange(c
11fd0 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68  onst Expr *p, ch
11fe0 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70  ar aff){.  u8 op
11ff0 3b 0a 20 20 69 6e 74 20 75 6e 61 72 79 4d 69 6e  ;.  int unaryMin
12000 75 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 66  us = 0;.  if( af
12010 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  f==SQLITE_AFF_BL
12020 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  OB ) return 1;. 
12030 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
12040 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
12050 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 0a 20  ==TK_UMINUS ){. 
12060 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
12070 5f 55 4d 49 4e 55 53 20 29 20 75 6e 61 72 79 4d  _UMINUS ) unaryM
12080 69 6e 75 73 20 3d 20 31 3b 0a 20 20 20 20 70 20  inus = 1;.    p 
12090 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a  = p->pLeft;.  }.
120a0 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
120b0 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
120c0 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
120d0 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
120e0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
120f0 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
12100 72 65 74 75 72 6e 20 61 66 66 3e 3d 53 51 4c 49  return aff>=SQLI
12110 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
12120 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
12130 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
12140 20 72 65 74 75 72 6e 20 61 66 66 3e 3d 53 51 4c   return aff>=SQL
12150 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
12160 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
12170 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
12180 20 20 20 72 65 74 75 72 6e 20 21 75 6e 61 72 79     return !unary
12190 4d 69 6e 75 73 20 26 26 20 61 66 66 3d 3d 53 51  Minus && aff==SQ
121a0 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
121b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
121c0 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72  _BLOB: {.      r
121d0 65 74 75 72 6e 20 21 75 6e 61 72 79 4d 69 6e 75  eturn !unaryMinu
121e0 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  s;.    }.    cas
121f0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
12200 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
12210 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a  iTable>=0 );  /*
12220 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72   p cannot be par
12230 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e  t of a CHECK con
12240 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
12250 20 72 65 74 75 72 6e 20 61 66 66 3e 3d 53 51 4c   return aff>=SQL
12260 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
12270 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 3b  && p->iColumn<0;
12280 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
12290 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lt: {.      retu
122a0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
122b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
122c0 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
122d0 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f  n string is a ro
122e0 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  w-id column name
122f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12300 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68  IsRowid(const ch
12310 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71  ar *z){.  if( sq
12320 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
12330 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20  "_ROWID_")==0 ) 
12340 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
12350 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
12360 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20  , "ROWID")==0 ) 
12370 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
12380 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
12390 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65  , "OID")==0 ) re
123a0 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
123b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20   0;.}../*.** pX 
123c0 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e  is the RHS of an
123d0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49   IN operator.  I
123e0 66 20 70 58 20 69 73 20 61 20 53 45 4c 45 43 54  f pX is a SELECT
123f0 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74   statement .** t
12400 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d 70 6c  hat can be simpl
12410 69 66 69 65 64 20 74 6f 20 61 20 64 69 72 65 63  ified to a direc
12420 74 20 74 61 62 6c 65 20 61 63 63 65 73 73 2c 20  t table access, 
12430 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61  then return.** a
12440 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12450 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12460 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f 74 20  .  If pX is not 
12470 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
12480 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65  nt,.** or if the
12490 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
124a0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 61  t needs to be ma
124b0 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20 61 20  nifested into a 
124c0 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62  transient.** tab
124d0 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  le, then return 
124e0 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  NULL..*/.#ifndef
124f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
12500 51 55 45 52 59 0a 73 74 61 74 69 63 20 53 65 6c  QUERY.static Sel
12510 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61 74 65  ect *isCandidate
12520 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20 2a 70  ForInOpt(Expr *p
12530 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  X){.  Select *p;
12540 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
12550 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
12560 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
12570 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Tab;.  int i;.  
12580 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
12590 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
125a0 65 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e 20  elect) ) return 
125b0 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62  0;  /* Not a sub
125c0 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 45  query */.  if( E
125d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
125e0 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  X, EP_VarSelect)
125f0 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f    ) return 0;  /
12600 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73 75 62  * Correlated sub
12610 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78  q */.  p = pX->x
12620 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20  .pSelect;.  if( 
12630 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75  p->pPrior ) retu
12640 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
12650 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70     /* Not a comp
12660 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
12670 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
12680 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
12690 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b  SF_Aggregate) ){
126a0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
126b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
126c0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
126d0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
126e0 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65  stinct );.    te
126f0 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
12700 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
12710 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
12720 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
12730 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
12740 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54  ; /* No DISTINCT
12750 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20   keyword and no 
12760 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
12770 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73  ons */.  }.  ass
12780 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
12790 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
127a0 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52      /* Has no GR
127b0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
127c0 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
127d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
127e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
127f0 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   no LIMIT clause
12800 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   */.  if( p->pWh
12810 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
12820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12830 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  Has no WHERE cla
12840 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  use */.  pSrc = 
12850 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
12860 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
12870 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
12880 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
12890 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
128a0 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c   term in FROM cl
128b0 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
128c0 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
128d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
128e0 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20   /* FROM is not 
128f0 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69  a subquery or vi
12900 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70  ew */.  pTab = p
12910 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
12920 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
12930 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
12940 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
12950 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
12960 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
12970 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  not a view */.  
12980 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
12990 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ab) ) return 0; 
129a0 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
129b0 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74  lause not a virt
129c0 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  ual table */.  p
129d0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
129e0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  t;.  assert( pEL
129f0 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41  ist!=0 );.  /* A
12a00 6c 6c 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  ll SELECT result
12a10 73 20 6d 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e  s must be column
12a20 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  s. */.  for(i=0;
12a30 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
12a40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
12a50 20 2a 70 52 65 73 20 3d 20 70 45 4c 69 73 74 2d   *pRes = pEList-
12a60 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
12a70 20 69 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54   if( pRes->op!=T
12a80 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
12a90 6e 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  n 0;.    assert(
12aa0 20 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70   pRes->iTable==p
12ab0 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  Src->a[0].iCurso
12ac0 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63  r );  /* Not a c
12ad0 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
12ae0 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ry */.  }.  retu
12af0 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn p;.}.#endif /
12b00 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
12b10 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
12b20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
12b30 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
12b40 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
12b50 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66 74   checks the left
12b60 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
12b70 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75 72  index table iCur
12b80 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69 74   to see if.** it
12b90 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
12ba0 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61 75  LL entries.  Cau
12bb0 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20  se the register 
12bc0 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f  at regHasNull to
12bd0 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20   be set.** to a 
12be0 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
12bf0 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  f iCur contains 
12c00 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65  no NULLs.  Cause
12c10 20 72 65 67 69 73 74 65 72 20 72 65 67 48 61 73   register regHas
12c20 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65  Null.** to be se
12c30 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75  t to NULL if iCu
12c40 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  r contains one o
12c50 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
12c60 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
12c70 69 64 20 73 71 6c 69 74 65 33 53 65 74 48 61 73  id sqlite3SetHas
12c80 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a 76  NullFlag(Vdbe *v
12c90 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74 20  , int iCur, int 
12ca0 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69  regHasNull){.  i
12cb0 6e 74 20 61 64 64 72 31 3b 0a 20 20 73 71 6c 69  nt addr1;.  sqli
12cc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12cd0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
12ce0 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61  regHasNull);.  a
12cf0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
12d00 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
12d10 65 77 69 6e 64 2c 20 69 43 75 72 29 3b 20 56 64  ewind, iCur); Vd
12d20 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
12d30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12d40 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
12d50 20 69 43 75 72 2c 20 30 2c 20 72 65 67 48 61 73   iCur, 0, regHas
12d60 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  Null);.  sqlite3
12d70 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
12d80 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
12d90 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
12da0 28 28 76 2c 20 22 66 69 72 73 74 5f 65 6e 74 72  ((v, "first_entr
12db0 79 5f 69 6e 28 25 64 29 22 2c 20 69 43 75 72 29  y_in(%d)", iCur)
12dc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12dd0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
12de0 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  1);.}.#endif...#
12df0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12e00 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
12e10 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
12e20 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
12e30 20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f   with a list (no
12e40 74 20 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e  t a subquery) on
12e50 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   the .** right-h
12e60 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75 72  and side.  Retur
12e70 6e 20 54 52 55 45 20 69 66 20 74 68 61 74 20 6c  n TRUE if that l
12e80 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  ist is constant.
12e90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
12ea0 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
12eb0 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29  stant(Expr *pIn)
12ec0 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a  {.  Expr *pLHS;.
12ed0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73    int res;.  ass
12ee0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
12ef0 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49  perty(pIn, EP_xI
12f00 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c  sSelect) );.  pL
12f10 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b  HS = pIn->pLeft;
12f20 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
12f30 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74  0;.  res = sqlit
12f40 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
12f50 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c  (pIn);.  pIn->pL
12f60 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65  eft = pLHS;.  re
12f70 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64  turn res;.}.#end
12f80 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
12f90 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
12fa0 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
12fb0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20  ation of the IN 
12fc0 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a  (...) operator..
12fd0 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65  ** The pX parame
12fe0 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65  ter is the expre
12ff0 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53  ssion on the RHS
13000 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
13010 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69  tor, which.** mi
13020 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20  ght be either a 
13030 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
13040 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72  ons or a subquer
13050 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  y..**.** The job
13060 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
13070 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
13080 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f  reate a b-tree o
13090 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a  bject that can.*
130a0 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72  * be used either
130b0 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d   to test for mem
130c0 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52  bership in the R
130d0 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65  HS set or to ite
130e0 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rate through.** 
130f0 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74  all members of t
13100 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70  he RHS set, skip
13110 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e  ping duplicates.
13120 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20  .**.** A cursor 
13130 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  is opened on the
13140 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
13150 68 61 74 20 69 73 20 74 68 65 20 52 48 53 20 6f  hat is the RHS o
13160 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
13170 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61  r.** and pX->iTa
13180 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ble is set to th
13190 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
131a0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
131b0 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
131c0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
131d0 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  n indicates the 
131e0 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20  b-tree type, as 
131f0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
13200 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20   IN_INDEX_ROWID 
13210 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
13220 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
13230 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
13240 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
13250 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65  INDEX_ASC  - The
13260 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
13270 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  ed on an ascendi
13280 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49  ng index..**   I
13290 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
132a0 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  SC - The cursor 
132b0 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
132c0 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
132d0 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
132e0 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65  EPH        - The
132f0 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
13300 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c  ed on a speciall
13310 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  y created and.**
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13330 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74           populat
13340 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ed epheremal tab
13350 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
13360 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e  X_NOOP       - N
13370 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c  o cursor was all
13380 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20  ocated.  The IN 
13390 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65  operator must be
133a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
133b0 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c              impl
133c0 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65 71  emented as a seq
133d0 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
133e0 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  sons..**.** An e
133f0 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d  xisting b-tree m
13400 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20  ight be used if 
13410 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69  the RHS expressi
13420 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c  on pX is a simpl
13430 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75  e.** subquery su
13440 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ch as:.**.**    
13450 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31   SELECT <column1
13460 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20  >, <column2>... 
13470 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
13480 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66  ** If the RHS of
13490 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
134a0 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20   is a list or a 
134b0 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62  more complex sub
134c0 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61  query, then.** a
134d0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
134e0 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
134f0 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  be generated fro
13500 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68  m the RHS and th
13510 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65  en.** pX->iTable
13520 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
13530 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  o the ephemeral 
13540 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66  table instead of
13550 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20   an.** existing 
13560 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
13570 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74   inFlags paramet
13580 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 2c  er must contain,
13590 20 61 74 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 6f   at a minimum, o
135a0 6e 65 20 6f 66 20 74 68 65 20 62 69 74 73 0a 2a  ne of the bits.*
135b0 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  * IN_INDEX_MEMBE
135c0 52 53 48 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45  RSHIP or IN_INDE
135d0 58 5f 4c 4f 4f 50 20 62 75 74 20 6e 6f 74 20 62  X_LOOP but not b
135e0 6f 74 68 2e 20 20 49 66 20 69 6e 46 6c 61 67 73  oth.  If inFlags
135f0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f   contains.** IN_
13600 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
13610 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72  , then the gener
13620 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20  ated table will 
13630 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 66 61  be used for a fa
13640 73 74 0a 2a 2a 20 6d 65 6d 62 65 72 73 68 69 70  st.** membership
13650 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65   test.  When the
13660 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62   IN_INDEX_LOOP b
13670 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 20 49  it is set, the I
13680 4e 20 69 6e 64 65 78 20 77 69 6c 6c 0a 2a 2a 20  N index will.** 
13690 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20  be used to loop 
136a0 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
136b0 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  of the RHS of th
136c0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  e IN operator..*
136d0 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44  *.** When IN_IND
136e0 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20  EX_LOOP is used 
136f0 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20  (and the b-tree 
13700 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
13710 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
13720 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  gh the set membe
13730 72 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74  rs) then the b-t
13740 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e  ree must not con
13750 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e  tain duplicates.
13760 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c  .** An epheremal
13770 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 63   table will be c
13780 72 65 61 74 65 64 20 75 6e 6c 65 73 73 20 74 68  reated unless th
13790 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d  e selected colum
137a0 6e 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ns are guarantee
137b0 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75  d.** to be uniqu
137c0 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75  e - either becau
137d0 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45  se it is an INTE
137e0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
137f0 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55  or due to.** a U
13800 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
13810 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a   or index..**.**
13820 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d   When IN_INDEX_M
13830 45 4d 42 45 52 53 48 49 50 20 69 73 20 75 73 65  EMBERSHIP is use
13840 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65  d (and the b-tre
13850 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
13860 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20  ** for fast set 
13870 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
13880 29 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65  ) then an ephere
13890 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a  mal table must .
138a0 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73  ** be used unles
138b0 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61  s <columns> is a
138c0 20 73 69 6e 67 6c 65 20 49 4e 54 45 47 45 52 20   single INTEGER 
138d0 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
138e0 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64  mn or an .** ind
138f0 65 78 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  ex can be found 
13900 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
13910 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20  ed <columns> as 
13920 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a  its left-most..*
13930 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49  *.** If the IN_I
13940 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64  NDEX_NOOP_OK and
13950 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
13960 53 48 49 50 20 61 72 65 20 62 6f 74 68 20 73 65  SHIP are both se
13970 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20  t and.** if the 
13980 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
13990 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
139a0 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79   (not a subquery
139b0 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72  ) then this.** r
139c0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63  outine might dec
139d0 69 64 65 20 74 68 61 74 20 63 72 65 61 74 69 6e  ide that creatin
139e0 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62  g an ephemeral b
139f0 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72  -tree for member
13a00 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ship.** testing 
13a10 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65  is too expensive
13a20 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49   and return IN_I
13a30 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74  NDEX_NOOP.  In t
13a40 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a  hat case, the.**
13a50 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
13a60 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e   should implemen
13a70 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  t the IN operato
13a80 72 20 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e  r using a sequen
13a90 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e  ce.** of Eq or N
13aa0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
13ab0 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57  rations..**.** W
13ac0 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69  hen the b-tree i
13ad0 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  s being used for
13ae0 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
13af0 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  s, the calling f
13b00 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74  unction.** might
13b10 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68   need to know wh
13b20 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
13b30 20 52 48 53 20 73 69 64 65 20 6f 66 20 74 68 65   RHS side of the
13b40 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
13b50 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e  contains a NULL.
13b60 20 20 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c    If prRhsHasNul
13b70 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20  l is not a NULL 
13b80 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20  pointer and .** 
13b90 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  if there is any 
13ba0 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
13bb0 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74  (...) might cont
13bc0 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ain a NULL value
13bd0 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20   at.** runtime, 
13be0 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20  then a register 
13bf0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
13c00 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
13c10 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20  mber written.** 
13c20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  to *prRhsHasNull
13c30 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
13c40 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
13c50 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20   (...) contains 
13c60 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c  a.** NULL value,
13c70 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e   then *prRhsHasN
13c80 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68  ull is left unch
13c90 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
13ca0 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
13cb0 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20  located and its 
13cc0 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  location stored 
13cd0 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  in *prRhsHasNull
13ce0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61  , then.** the va
13cf0 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65 67 69  lue in that regi
13d00 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c  ster will be NUL
13d10 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20  L if the b-tree 
13d20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
13d30 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  more.** NULL val
13d40 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c  ues, and it will
13d50 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c   be some non-NUL
13d60 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 62  L value if the b
13d70 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e  -tree contains n
13d80 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  o.** NULL values
13d90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61  ..**.** If the a
13da0 69 4d 61 70 20 70 61 72 61 6d 65 74 65 72 20 69  iMap parameter i
13db0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d  s not NULL, it m
13dc0 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ust point to an 
13dd0 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67  array containing
13de0 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20  .** one element 
13df0 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
13e00 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
13e10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13e20 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f   on the RHS.** o
13e30 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70  f the IN(...) op
13e40 65 72 61 74 6f 72 2e 20 54 68 65 20 69 27 74 68  erator. The i'th
13e50 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 61 72   entry of the ar
13e60 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ray is populated
13e70 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66   with the.** off
13e80 73 65 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  set of the index
13e90 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74   column that mat
13ea0 63 68 65 73 20 74 68 65 20 69 27 74 68 20 63 6f  ches the i'th co
13eb0 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79  lumn returned by
13ec0 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20   the.** SELECT. 
13ed0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
13ee0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
13ef0 6e 64 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65  nd selected inde
13f00 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  x are:.**.**   (
13f10 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43  ?,?,?) IN (SELEC
13f20 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74  T a, b, c FROM t
13f30 31 29 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  1).**   CREATE I
13f40 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 2c  NDEX i1 ON t1(b,
13f50 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68   c, a);.**.** th
13f60 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f  en aiMap[] is po
13f70 70 75 6c 61 74 65 64 20 77 69 74 68 20 7b 32 2c  pulated with {2,
13f80 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64   0, 1}..*/.#ifnd
13f90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
13fa0 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
13fb0 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a  te3FindInIndex(.
13fc0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13fe0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
13ff0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 2c 20 20  */.  Expr *pX,  
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
14020 64 20 73 69 64 65 20 28 52 48 53 29 20 6f 66 20  d side (RHS) of 
14030 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
14040 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c 61 67 73  */.  u32 inFlags
14050 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14060 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  /* IN_INDEX_LOOP
14070 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 61  , _MEMBERSHIP, a
14080 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a  nd/or _NOOP_OK *
14090 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68 73 48 61  /.  int *prRhsHa
140a0 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 2f  sNull,         /
140b0 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
140c0 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75 73 2e 20  ng NULL status. 
140d0 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20   See notes */.  
140e0 69 6e 74 20 2a 61 69 4d 61 70 2c 20 20 20 20 20  int *aiMap,     
140f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
14100 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e 64 65 78  pping from Index
14110 20 66 69 65 6c 64 73 20 74 6f 20 52 48 53 20 66   fields to RHS f
14120 69 65 6c 64 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  ields */.  int *
14130 70 69 54 61 62 20 20 20 20 20 20 20 20 20 20 20  piTab           
14140 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 69 6e        /* OUT: in
14150 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b  dex to use */.){
14160 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20  .  Select *p;   
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14180 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
14190 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  CT to the right 
141a0 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
141b0 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
141c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
141d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
141e0 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20  e of RHS table. 
141f0 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20  IN_INDEX_* */.  
14200 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
14210 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20  e->nTab++;      
14220 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
14230 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65  of the RHS table
14240 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65   */.  int mustBe
14250 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20  Unique;         
14260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14270 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20  rue if RHS must 
14280 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56  be unique */.  V
14290 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
142a0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
142b0 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
142c0 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f  machine being co
142d0 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ded */..  assert
142e0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
142f0 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75  );.  mustBeUniqu
14300 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49  e = (inFlags & I
14310 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30  N_INDEX_LOOP)!=0
14320 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52  ;..  /* If the R
14330 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e  HS of this IN(..
14340 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  .) operator is a
14350 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66 20   SELECT, and if 
14360 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a  it matters .  **
14370 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
14380 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c  the SELECT resul
14390 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  t contains NULL 
143a0 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77 68  values, check wh
143b0 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f  ether.  ** or no
143c0 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61 6c  t NULL is actual
143d0 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74 20  ly possible (it 
143e0 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20  may not be, for 
143f0 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20  example, due .  
14400 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63  ** to NOT NULL c
14410 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
14420 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f  e schema). If no
14430 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
14440 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20   possible,.  ** 
14450 73 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  set prRhsHasNull
14460 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f 6e   to 0 before con
14470 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69  tinuing.  */.  i
14480 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
14490 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20 26 20  && (pX->flags & 
144a0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
144b0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
144c0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
144d0 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74   = pX->x.pSelect
144e0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f  ->pEList;.    fo
144f0 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
14500 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
14510 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
14520 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c  xprCanBeNull(pEL
14530 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
14540 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
14550 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69 73      if( i==pELis
14560 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
14570 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d    prRhsHasNull =
14580 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
14590 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
145a0 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
145b0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63  table or index c
145c0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  an be used to.  
145d0 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20 71  ** satisfy the q
145e0 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20 70  uery.  This is p
145f0 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e  referable to gen
14600 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20  erating a new . 
14610 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61   ** ephemeral ta
14620 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ble.  */.  if( p
14630 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26  Parse->nErr==0 &
14640 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64 61  & (p = isCandida
14650 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29 21  teForInOpt(pX))!
14660 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14670 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
14680 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
14690 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
146a0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54  nection */.    T
146b0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146d0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c        /* Table <
146e0 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
146f0 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  16 iDb;         
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
14720 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a  e idx for pTab *
14730 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
14740 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
14750 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  st;.    int nExp
14760 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
14770 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  r;..    assert( 
14780 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20  p->pEList!=0 ); 
14790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
147a0 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
147b0 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
147c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
147d0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
147e0 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42  pExpr!=0 ); /* B
147f0 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
14800 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
14810 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
14820 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20  p->pSrc!=0 );   
14830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
14840 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
14850 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
14860 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70   */.    pTab = p
14870 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
14880 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20  b;..    /* Code 
14890 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  an OP_Transactio
148a0 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f  n and OP_TableLo
148b0 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20  ck for <table>. 
148c0 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
148d0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
148e0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
148f0 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ema);.    sqlite
14900 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
14910 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
14920 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
14930 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
14940 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
14950 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
14960 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 20 20      assert(v);  
14970 2f 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62  /* sqlite3GetVdb
14980 65 28 29 20 68 61 73 20 61 6c 77 61 79 73 20 62  e() has always b
14990 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63  een previously c
149a0 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  alled */.    if(
149b0 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c   nExpr==1 && pEL
149c0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
149d0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
149e0 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49 4e      /* The "x IN
149f0 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   (SELECT rowid F
14a00 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73 65  ROM table)" case
14a10 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41   */.      int iA
14a20 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
14a30 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
14a40 63 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ce);.      VdbeC
14a50 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
14a60 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
14a70 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
14a80 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
14a90 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
14aa0 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
14ab0 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 45  X_ROWID;.      E
14ac0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
14ad0 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20  (pParse, 0,.    
14ae0 20 20 20 20 20 20 20 20 22 55 53 49 4e 47 20 52          "USING R
14af0 4f 57 49 44 20 53 45 41 52 43 48 20 4f 4e 20 54  OWID SEARCH ON T
14b00 41 42 4c 45 20 25 73 20 46 4f 52 20 49 4e 2d 4f  ABLE %s FOR IN-O
14b10 50 45 52 41 54 4f 52 22 2c 70 54 61 62 2d 3e 7a  PERATOR",pTab->z
14b20 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
14b30 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14b40 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
14b50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
14b60 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
14b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b80 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
14b90 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
14ba0 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b   int affinity_ok
14bb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
14bc0 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  i;..      /* Che
14bd0 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69  ck that the affi
14be0 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62  nity that will b
14bf0 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72  e used to perfor
14c00 6d 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a  m each .      **
14c10 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
14c20 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61  he same as the a
14c30 66 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68 20  ffinity of each 
14c40 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a  column in table.
14c50 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
14c60 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
14c70 65 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 6e  erator.  If it n
14c80 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ot, it is not po
14c90 73 73 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ssible to.      
14ca0 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78  ** use any index
14cb0 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
14cc0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  e.  */.      for
14cd0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26  (i=0; i<nExpr &&
14ce0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b   affinity_ok; i+
14cf0 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
14d00 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33   *pLhs = sqlite3
14d10 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
14d20 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29  pr(pX->pLeft, i)
14d30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  ;.        int iC
14d40 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  ol = pEList->a[i
14d50 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
14d60 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 69  ;.        char i
14d70 64 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54  dxaff = sqlite3T
14d80 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
14d90 74 79 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f  ty(pTab,iCol); /
14da0 2a 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20  * RHS table */. 
14db0 20 20 20 20 20 20 20 63 68 61 72 20 63 6d 70 61         char cmpa
14dc0 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
14dd0 61 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73  areAffinity(pLhs
14de0 2c 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20  , idxaff);.     
14df0 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70     testcase( cmp
14e00 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
14e10 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 20 20  BLOB );.        
14e20 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66  testcase( cmpaff
14e30 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
14e40 54 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69  T );.        swi
14e50 74 63 68 28 20 63 6d 70 61 66 66 20 29 7b 0a 20  tch( cmpaff ){. 
14e60 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
14e70 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20  LITE_AFF_BLOB:. 
14e80 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
14e90 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ;.          case
14ea0 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
14eb0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  :.            /*
14ec0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
14ed0 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72  ffinity() only r
14ee0 65 74 75 72 6e 73 20 54 45 58 54 20 69 66 20 6f  eturns TEXT if o
14ef0 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20  ne side or the. 
14f00 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74             ** ot
14f10 68 65 72 20 68 61 73 20 6e 6f 20 61 66 66 69 6e  her has no affin
14f20 69 74 79 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ity and the othe
14f30 72 20 73 69 64 65 20 69 73 20 54 45 58 54 2e 20  r side is TEXT. 
14f40 20 48 65 6e 63 65 2c 0a 20 20 20 20 20 20 20 20   Hence,.        
14f50 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20      ** the only 
14f60 77 61 79 20 66 6f 72 20 63 6d 70 61 66 66 20 74  way for cmpaff t
14f70 6f 20 62 65 20 54 45 58 54 20 69 73 20 66 6f 72  o be TEXT is for
14f80 20 69 64 78 61 66 66 20 74 6f 20 62 65 20 54 45   idxaff to be TE
14f90 58 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  XT.            *
14fa0 2a 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 65  * and for the te
14fb0 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  rm on the LHS of
14fc0 20 74 68 65 20 49 4e 20 74 6f 20 68 61 76 65 20   the IN to have 
14fd0 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  no affinity. */.
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
14ff0 72 74 28 20 69 64 78 61 66 66 3d 3d 53 51 4c 49  rt( idxaff==SQLI
15000 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
15010 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
15020 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61  ;.          defa
15030 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ult:.           
15040 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73   affinity_ok = s
15050 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
15060 66 66 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b  ffinity(idxaff);
15070 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15080 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 61 66   }..      if( af
15090 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20  finity_ok ){.   
150a0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
150b0 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69  or an existing i
150c0 6e 64 65 78 20 74 68 61 74 20 77 69 6c 6c 20 77  ndex that will w
150d0 6f 72 6b 20 66 6f 72 20 74 68 69 73 20 49 4e 20  ork for this IN 
150e0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
150f0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
15100 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
15110 26 26 20 65 54 79 70 65 3d 3d 30 3b 20 70 49 64  && eType==0; pId
15120 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
15130 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
15140 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20 20 20 20  k colUsed;      
15150 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  /* Columns of th
15160 65 20 69 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a  e index used */.
15170 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
15180 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  k mCol;         
15190 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20  /* Mask for the 
151a0 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a  current column *
151b0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
151c0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45  pIdx->nColumn<nE
151d0 78 70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  xpr ) continue;.
151e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
151f0 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
15200 65 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e!=0 ) continue;
15210 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
15220 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73  ximum nColumn is
15230 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d   BMS-2, not BMS-
15240 31 2c 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  1, so that we ca
15250 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20 20 20 20  n compute.      
15260 20 20 20 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e      ** BITMASK(n
15270 45 78 70 72 29 20 77 69 74 68 6f 75 74 20 6f 76  Expr) without ov
15280 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20  erflowing */.   
15290 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
152a0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
152b0 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 20  BMS-2 );.       
152c0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64     testcase( pId
152d0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d  x->nColumn==BMS-
152e0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1 );.          i
152f0 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
15300 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e  >=BMS-1 ) contin
15310 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
15320 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 29  ( mustBeUnique )
15330 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
15340 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e  ( pIdx->nKeyCol>
15350 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20  nExpr.          
15360 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c     ||(pIdx->nCol
15370 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20 21 49 73  umn>nExpr && !Is
15380 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
15390 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  )).            )
153a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
153b0 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68  continue;  /* Th
153c0 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  is index is not 
153d0 75 6e 69 71 75 65 20 6f 76 65 72 20 74 68 65 20  unique over the 
153e0 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a  IN RHS columns *
153f0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  /.            }.
15400 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20            }.  . 
15410 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64           colUsed
15420 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d   = 0;   /* Colum
15430 6e 73 20 6f 66 20 69 6e 64 65 78 20 75 73 65 64  ns of index used
15440 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
15450 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15460 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
15470 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
15480 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63  Lhs = sqlite3Vec
15490 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
154a0 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pX->pLeft, i);. 
154b0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
154c0 2a 70 52 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e  *pRhs = pEList->
154d0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
154e0 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
154f0 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42  *pReq = sqlite3B
15500 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
15510 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73  Seq(pParse, pLhs
15520 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20  , pRhs);.       
15530 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20       int j;.  . 
15540 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
15550 74 28 20 70 52 65 71 21 3d 30 20 7c 7c 20 70 52  t( pReq!=0 || pR
15560 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f  hs->iColumn==XN_
15570 52 4f 57 49 44 20 7c 7c 20 70 50 61 72 73 65 2d  ROWID || pParse-
15580 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20  >nErr );.       
15590 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
155a0 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
155b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
155c0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
155d0 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20  !=pRhs->iColumn 
155e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
155f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15600 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  ( pIdx->azColl[j
15610 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ] );.           
15620 20 20 20 69 66 28 20 70 52 65 71 21 3d 30 20 26     if( pReq!=0 &
15630 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
15640 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49  (pReq->zName, pI
15650 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  dx->azColl[j])!=
15660 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
15670 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
156a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
156b0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
156c0 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62 72 65  ( j==nExpr ) bre
156d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
156e0 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a  mCol = MASKBIT(j
156f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
15700 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65  f( mCol & colUse
15710 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61  d ) break; /* Ea
15720 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f  ch column used o
15730 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20  nly once */.    
15740 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20          colUsed 
15750 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20  |= mCol;.       
15760 20 20 20 20 20 69 66 28 20 61 69 4d 61 70 20 29       if( aiMap )
15770 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20   aiMap[i] = j;. 
15780 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
15790 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
157a0 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55  i==nExpr || colU
157b0 73 65 64 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45  sed!=(MASKBIT(nE
157c0 78 70 72 29 2d 31 29 20 29 3b 0a 20 20 20 20 20  xpr)-1) );.     
157d0 20 20 20 20 20 69 66 28 20 63 6f 6c 55 73 65 64       if( colUsed
157e0 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72  ==(MASKBIT(nExpr
157f0 29 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  )-1) ){.        
15800 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
15810 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  ch this point, t
15820 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 69 6e  hat means the in
15830 64 65 78 20 70 49 64 78 20 69 73 20 75 73 61 62  dex pIdx is usab
15840 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
15850 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
15860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
15870 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
15880 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15890 20 20 20 20 20 20 20 20 20 20 45 78 70 6c 61 69            Explai
158a0 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
158b0 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  se, 0,.         
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 20 20 20 22 55 53 49 4e 47 20 49 4e 44 45       "USING INDE
158e0 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52  X %s FOR IN-OPER
158f0 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d  ATOR",pIdx->zNam
15900 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
15910 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15920 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
15930 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74  d, iTab, pIdx->t
15940 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
15950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15960 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
15970 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
15980 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
15990 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
159a0 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
159b0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
159c0 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  t( IN_INDEX_INDE
159d0 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44  X_DESC == IN_IND
159e0 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29  EX_INDEX_ASC+1 )
159f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 54  ;.            eT
15a00 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
15a10 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d  NDEX_ASC + pIdx-
15a20 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a  >aSortOrder[0];.
15a30 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69    .            i
15a40 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
15a50 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
15a60 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
15a70 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20  SED_MASK.       
15a80 20 20 20 20 20 20 20 69 36 34 20 6d 61 73 6b 20         i64 mask 
15a90 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a  = (1<<nExpr)-1;.
15aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
15ab0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
15ac0 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
15ad0 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20  sUsed, .        
15ae0 20 20 20 20 20 20 20 20 20 20 69 54 61 62 2c 20            iTab, 
15af0 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b  0, 0, (u8*)&mask
15b00 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e  , P4_INT64);.#en
15b10 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
15b20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
15b30 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
15b40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15b50 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a  if( nExpr==1 ){.
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
15b80 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a  lFlag(v, iTab, *
15b90 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20  prRhsHasNull);. 
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
15bb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
15bc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15bd0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
15be0 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  iAddr);.        
15bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a    }.        } /*
15c00 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 69   End loop over i
15c10 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20 20 20  ndexes */.      
15c20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61 66 66  } /* End if( aff
15c30 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20  inity_ok ) */.  
15c40 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20 6e 6f    } /* End if no
15c50 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64 65 78  t an rowid index
15c60 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 61   */.  } /* End a
15c70 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69  ttempt to optimi
15c80 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  ze using an inde
15c90 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  x */..  /* If no
15ca0 20 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64   preexisting ind
15cb0 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ex is available 
15cc0 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73  for the IN claus
15cd0 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e  e.  ** and IN_IN
15ce0 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61  DEX_NOOP is an a
15cf0 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a  llowed reply.  *
15d00 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66  * and the RHS of
15d10 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
15d20 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20   is a list, not 
15d30 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  a subquery.  ** 
15d40 61 6e 64 20 74 68 65 20 52 48 53 20 69 73 20 6e  and the RHS is n
15d50 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68  ot constant or h
15d60 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  as two or fewer 
15d70 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e  terms,.  ** then
15d80 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68   it is not worth
15d90 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
15da0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
15db0 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68  evaluate.  ** th
15dc0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f  e IN operator so
15dd0 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58   return IN_INDEX
15de0 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66  _NOOP..  */.  if
15df0 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26  ( eType==0.   &&
15e00 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
15e10 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20  NDEX_NOOP_OK).  
15e20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
15e30 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
15e40 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21 73  elect).   && (!s
15e50 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
15e60 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d  stant(pX) || pX-
15e70 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c  >x.pList->nExpr<
15e80 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79  =2).  ){.    eTy
15e90 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  pe = IN_INDEX_NO
15ea0 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65  OP;.  }..  if( e
15eb0 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Type==0 ){.    /
15ec0 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  * Could not find
15ed0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
15ee0 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75  le or index to u
15ef0 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d  se as the RHS b-
15f00 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  tree..    ** We 
15f10 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e  will have to gen
15f20 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  erate an ephemer
15f30 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74  al table to do t
15f40 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  he job..    */. 
15f50 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75 65     u32 savedNQue
15f60 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
15f70 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  >nQueryLoop;.   
15f80 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
15f90 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65  l = 0;.    eType
15fa0 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b   = IN_INDEX_EPH;
15fb0 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73  .    if( inFlags
15fc0 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
15fd0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
15fe0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30  ->nQueryLoop = 0
15ff0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
16000 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a  prRhsHasNull ){.
16010 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e        *prRhsHasN
16020 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75  ull = rMayHaveNu
16030 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
16040 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  Mem;.    }.    a
16050 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
16060 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 73 71 6c 69  K_IN );.    sqli
16070 74 65 33 43 6f 64 65 52 68 73 4f 66 49 4e 28 70  te3CodeRhsOfIN(p
16080 50 61 72 73 65 2c 20 70 58 2c 20 69 54 61 62 29  Parse, pX, iTab)
16090 3b 0a 20 20 20 20 69 66 28 20 72 4d 61 79 48 61  ;.    if( rMayHa
160a0 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  veNull ){.      
160b0 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
160c0 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 72  lFlag(v, iTab, r
160d0 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20  MayHaveNull);.  
160e0 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
160f0 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76  nQueryLoop = sav
16100 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
16110 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61 70 20 26  }..  if( aiMap &
16120 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45  & eType!=IN_INDE
16130 58 5f 49 4e 44 45 58 5f 41 53 43 20 26 26 20 65  X_INDEX_ASC && e
16140 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type!=IN_INDEX_I
16150 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
16160 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e   int i, n;.    n
16170 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
16180 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65  ctorSize(pX->pLe
16190 66 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ft);.    for(i=0
161a0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61  ; i<n; i++) aiMa
161b0 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20  p[i] = i;.  }.  
161c0 2a 70 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  *piTab = iTab;. 
161d0 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
161e0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
161f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
16200 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75  QUERY./*.** Argu
16210 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20 61 6e  ment pExpr is an
16220 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e   (?, ?...) IN(..
16230 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54  .) expression. T
16240 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
16250 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72   allocates and r
16260 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72  eturns a nul-ter
16270 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63  minated string c
16280 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68  ontaining .** th
16290 65 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20  e affinities to 
162a0 62 65 20 75 73 65 64 20 66 6f 72 20 65 61 63 68  be used for each
162b0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63   column of the c
162c0 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a  omparison..**.**
162d0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
162e0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
162f0 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72   caller to ensur
16300 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  e that the retur
16310 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73  ned.** string is
16320 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
16330 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  d using sqlite3D
16340 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  bFree()..*/.stat
16350 69 63 20 63 68 61 72 20 2a 65 78 70 72 49 4e 41  ic char *exprINA
16360 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
16370 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
16380 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65  pr){.  Expr *pLe
16390 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
163a0 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20  t;.  int nVal = 
163b0 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
163c0 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
163d0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
163e0 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  = (pExpr->flags 
163f0 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
16400 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  ? pExpr->x.pSele
16410 63 74 20 3a 20 30 3b 0a 20 20 63 68 61 72 20 2a  ct : 0;.  char *
16420 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  zRet;..  assert(
16430 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
16440 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71  N );.  zRet = sq
16450 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
16460 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61  (pParse->db, nVa
16470 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a 52 65 74  l+1);.  if( zRet
16480 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
16490 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
164a0 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
164b0 45 78 70 72 20 2a 70 41 20 3d 20 73 71 6c 69 74  Expr *pA = sqlit
164c0 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
164d0 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
164e0 20 20 20 20 20 20 63 68 61 72 20 61 20 3d 20 73        char a = s
164f0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
16500 74 79 28 70 41 29 3b 0a 20 20 20 20 20 20 69 66  ty(pA);.      if
16510 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
16520 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73       zRet[i] = s
16530 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
16540 69 6e 69 74 79 28 70 53 65 6c 65 63 74 2d 3e 70  inity(pSelect->p
16550 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
16560 72 2c 20 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, a);.      }el
16570 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  se{.        zRet
16580 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d  [i] = a;.      }
16590 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b  .    }.    zRet[
165a0 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  nVal] = '\0';.  
165b0 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  }.  return zRet;
165c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
165d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
165e0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f  UBQUERY./*.** Lo
165f0 61 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  ad the Parse obj
16600 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
16610 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
16620 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 0a   with an error .
16630 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68  ** message of th
16640 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
16650 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
16660 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20  rns N columns - 
16670 65 78 70 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20  expected M".*/  
16680 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 75   .void sqlite3Su
16690 62 73 65 6c 65 63 74 45 72 72 6f 72 28 50 61 72  bselectError(Par
166a0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
166b0 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78  nActual, int nEx
166c0 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  pect){.  const c
166d0 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62  har *zFmt = "sub
166e0 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
166f0 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70  %d columns - exp
16700 65 63 74 65 64 20 25 64 22 3b 0a 20 20 73 71 6c  ected %d";.  sql
16710 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16720 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75  rse, zFmt, nActu
16730 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a  al, nExpect);.}.
16740 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78  #endif../*.** Ex
16750 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
16760 73 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 20  s a vector that 
16770 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 69 6e  has been used in
16780 20 61 20 63 6f 6e 74 65 78 74 20 77 68 65 72 65   a context where
16790 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 65  .** it is not pe
167a0 72 6d 69 74 74 65 64 2e 20 49 66 20 70 45 78 70  rmitted. If pExp
167b0 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  r is a sub-selec
167c0 74 20 76 65 63 74 6f 72 2c 20 74 68 69 73 20 72  t vector, this r
167d0 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73  outine .** loads
167e0 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
167f0 74 20 77 69 74 68 20 61 20 6d 65 73 73 61 67 65  t with a message
16800 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
16810 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63  .**   "sub-selec
16820 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75  t returns N colu
16830 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 31  mns - expected 1
16840 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ".**.** Or, if i
16850 74 20 69 73 20 61 20 72 65 67 75 6c 61 72 20 73  t is a regular s
16860 63 61 6c 61 72 20 76 65 63 74 6f 72 3a 0a 2a 2a  calar vector:.**
16870 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61 6c 75 65  .**   "row value
16880 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20 20 20 0a   misused".*/   .
16890 76 6f 69 64 20 73 71 6c 69 74 65 33 56 65 63 74  void sqlite3Vect
168a0 6f 72 45 72 72 6f 72 4d 73 67 28 50 61 72 73 65  orErrorMsg(Parse
168b0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
168c0 70 45 78 70 72 29 7b 0a 23 69 66 6e 64 65 66 20  pExpr){.#ifndef 
168d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
168e0 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
168f0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
16900 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
16910 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
16920 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ror(pParse, pExp
16930 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
16940 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b  List->nExpr, 1);
16950 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
16960 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45    {.    sqlite3E
16970 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16980 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
16990 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ed");.  }.}..#if
169a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
169b0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
169c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
169d0 61 74 20 77 69 6c 6c 20 63 6f 6e 73 74 72 75 63  at will construc
169e0 74 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  t an ephemeral t
169f0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
16a00 61 6c 6c 20 74 65 72 6d 73 0a 2a 2a 20 69 6e 20  all terms.** in 
16a10 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e  the RHS of an IN
16a20 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
16a30 49 4e 20 6f 70 65 72 61 74 6f 72 20 63 61 6e 20  IN operator can 
16a40 62 65 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  be in either of 
16a50 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a 0a 2a 2a  two.** forms:.**
16a60 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
16a70 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
16a80 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
16a90 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
16aa0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
16ab0 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
16ac0 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
16ad0 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
16ae0 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
16af0 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
16b00 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
16b10 65 74 65 72 20 69 73 20 74 68 65 20 49 4e 20 6f  eter is the IN o
16b20 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20 63 75  perator.  The cu
16b30 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
16b40 74 68 65 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74  the.** construct
16b50 65 64 20 65 70 68 65 72 6d 65 72 61 6c 20 74 61  ed ephermeral ta
16b60 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ble is returned.
16b70 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
16b80 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a   the ephemeral.*
16b90 2a 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 75  * table is compu
16ba0 74 65 64 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ted, the cursor 
16bb0 6e 75 6d 62 65 72 20 69 73 20 61 6c 73 6f 20 73  number is also s
16bc0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
16bd0 69 54 61 62 6c 65 2c 0a 2a 2a 20 68 6f 77 65 76  iTable,.** howev
16be0 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  er the cursor nu
16bf0 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 6d 69  mber returned mi
16c00 67 68 74 20 6e 6f 74 20 62 65 20 74 68 65 20 73  ght not be the s
16c10 61 6d 65 2c 20 61 73 20 69 74 20 6d 69 67 68 74  ame, as it might
16c20 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 75  .** have been du
16c30 70 6c 69 63 61 74 65 64 20 75 73 69 6e 67 20 4f  plicated using O
16c40 50 5f 4f 70 65 6e 44 75 70 2e 0a 2a 2a 0a 2a 2a  P_OpenDup..**.**
16c50 20 49 66 20 74 68 65 20 4c 48 53 20 65 78 70 72   If the LHS expr
16c60 65 73 73 69 6f 6e 20 28 22 78 22 20 69 6e 20 74  ession ("x" in t
16c70 68 65 20 65 78 61 6d 70 6c 65 73 29 20 69 73 20  he examples) is 
16c80 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
16c90 6f 72 0a 2a 2a 20 74 68 65 20 53 45 4c 45 43 54  or.** the SELECT
16ca0 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
16cb0 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
16cc0 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
16cd0 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nity of that.** 
16ce0 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
16cf0 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
16d00 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
16d10 27 78 27 20 61 6e 64 20 74 68 65 0a 2a 2a 20 53  'x' and the.** S
16d20 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
16d30 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
16d40 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
16d50 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 2a 2a  inity is used.**
16d60 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d   if either colum
16d70 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72  n has NUMERIC or
16d80 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74   INTEGER affinit
16d90 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  y. If neither.**
16da0 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
16db0 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
16dc0 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
16dd0 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
16de0 69 74 79 0a 2a 2a 20 69 73 20 75 73 65 64 2e 0a  ity.** is used..
16df0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
16e00 6f 64 65 52 68 73 4f 66 49 4e 28 0a 20 20 50 61  odeRhsOfIN(.  Pa
16e10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
16e20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16e30 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
16e40 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
16e50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
16e60 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
16e70 74 20 69 54 61 62 20 20 20 20 20 20 20 20 20 20  t iTab          
16e80 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
16e90 73 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  s cursor number 
16ea0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  */.){.  int addr
16eb0 4f 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Once = 0;       
16ec0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
16ed0 66 20 74 68 65 20 4f 50 5f 4f 6e 63 65 20 69 6e  f the OP_Once in
16ee0 73 74 72 75 63 74 69 6f 6e 20 61 74 20 74 6f 70  struction at top
16ef0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20   */.  int addr; 
16f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f10 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
16f20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
16f30 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
16f40 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20    Expr *pLeft;  
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16f60 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
16f70 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
16f80 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16f90 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  fo = 0;      /* 
16fa0 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Key information 
16fb0 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20  */.  int nVal;  
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fd0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74   /* Size of vect
16fe0 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20 56 64  or pLeft */.  Vd
16ff0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
17000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17010 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
17020 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
17030 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 76 20 3d  uction */..  v =
17040 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
17050 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
17060 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c  ;..  /* The eval
17070 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  uation of the IN
17080 20 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65   must be repeate
17090 64 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a  d every time it.
170a0 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
170b0 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68  red if any of th
170c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
170d0 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
170e0 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
170f0 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
17100 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
17110 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
17120 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
17130 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
17140 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
17150 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
17160 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
17170 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
17180 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
17190 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
171a0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
171b0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
171c0 52 48 53 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  RHS just once.  
171d0 2a 2a 20 61 6e 64 20 72 65 75 73 65 20 69 74 20  ** and reuse it 
171e0 6d 61 6e 79 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f  many names..  */
171f0 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
17200 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
17210 50 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20  P_VarSelect) && 
17220 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
17230 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65  ==0 ){.    /* Re
17240 75 73 65 20 6f 66 20 74 68 65 20 52 48 53 20 69  use of the RHS i
17250 73 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20  s allowed */.   
17260 20 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74   /* If this rout
17270 69 6e 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ine has already 
17280 62 65 65 6e 20 63 6f 64 65 64 2c 20 62 75 74 20  been coded, but 
17290 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
172a0 65 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 6e  e.    ** might n
172b0 6f 74 20 68 61 76 65 20 62 65 65 6e 20 69 6e 76  ot have been inv
172c0 6f 6b 65 64 20 79 65 74 2c 20 73 6f 20 69 6e 76  oked yet, so inv
172d0 6f 6b 65 20 69 74 20 6e 6f 77 20 61 73 20 61 20  oke it now as a 
172e0 73 75 62 72 6f 75 74 69 6e 65 2e 20 0a 20 20 20  subroutine. .   
172f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72   */.    if( Expr
17300 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
17310 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 20 29 7b  r, EP_Subrtn) ){
17320 0a 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20  .      addrOnce 
17330 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
17340 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
17350 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17360 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
17370 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
17380 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
17390 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 6c   ){.        Expl
173a0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
173b0 61 72 73 65 2c 20 30 2c 20 22 52 45 55 53 45 20  arse, 0, "REUSE 
173c0 4c 49 53 54 20 53 55 42 51 55 45 52 59 20 25 64  LIST SUBQUERY %d
173d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
173e0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
173f0 74 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20  t->selId));.    
17400 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
17410 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17420 50 5f 47 6f 73 75 62 2c 20 70 45 78 70 72 2d 3e  P_Gosub, pExpr->
17430 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 2c  y.sub.regReturn,
17440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17450 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
17460 79 2e 73 75 62 2e 69 41 64 64 72 29 3b 0a 20 20  y.sub.iAddr);.  
17470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17480 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
17490 44 75 70 2c 20 69 54 61 62 2c 20 70 45 78 70 72  Dup, iTab, pExpr
174a0 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
174b0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
174c0 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65  Here(v, addrOnce
174d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
174e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42  .    }..    /* B
174f0 65 67 69 6e 20 63 6f 64 69 6e 67 20 74 68 65 20  egin coding the 
17500 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
17510 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
17520 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75 62 72  y(pExpr, EP_Subr
17530 74 6e 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  tn);.    pExpr->
17540 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 20  y.sub.regReturn 
17550 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
17560 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73  ;.    pExpr->y.s
17570 75 62 2e 69 41 64 64 72 20 3d 0a 20 20 20 20 20  ub.iAddr =.     
17580 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17590 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
175a0 2c 20 30 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75  , 0, pExpr->y.su
175b0 62 2e 72 65 67 52 65 74 75 72 6e 29 20 2b 20 31  b.regReturn) + 1
175c0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
175d0 74 28 28 76 2c 20 22 72 65 74 75 72 6e 20 61 64  t((v, "return ad
175e0 64 72 65 73 73 22 29 29 3b 0a 0a 20 20 20 20 61  dress"));..    a
175f0 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65  ddrOnce = sqlite
17600 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
17610 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
17620 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
17630 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
17640 20 69 66 20 74 68 69 73 20 69 73 20 61 20 76 65   if this is a ve
17650 63 74 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  ctor IN operator
17660 20 2a 2f 0a 20 20 70 4c 65 66 74 20 3d 20 70 45   */.  pLeft = pE
17670 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 6e 56  xpr->pLeft;.  nV
17680 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
17690 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
176a0 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75  );..  /* Constru
176b0 63 74 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  ct the ephemeral
176c0 20 74 61 62 6c 65 20 74 68 61 74 20 77 69 6c 6c   table that will
176d0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 63 6f 6e   contain the con
176e0 74 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 52 48 53  tent of.  ** RHS
176f0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
17700 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70 45 78 70  tor..  */.  pExp
17710 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  r->iTable = iTab
17720 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
17730 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17740 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
17750 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
17760 20 6e 56 61 6c 29 3b 0a 23 69 66 64 65 66 20 53   nVal);.#ifdef S
17770 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
17780 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
17790 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
177a0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
177b0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
177c0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
177d0 22 52 65 73 75 6c 74 20 6f 66 20 53 45 4c 45 43  "Result of SELEC
177e0 54 20 25 75 22 2c 20 70 45 78 70 72 2d 3e 78 2e  T %u", pExpr->x.
177f0 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64 29 29  pSelect->selId))
17800 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56  ;.  }else{.    V
17810 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
17820 52 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  RHS of IN operat
17830 6f 72 22 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  or"));.  }.#endi
17840 66 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73  f.  pKeyInfo = s
17850 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
17860 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
17870 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 69 66 28 20  Val, 1);..  if( 
17880 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
17890 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
178a0 65 63 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ect) ){.    /* C
178b0 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
178c0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
178d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 47 65      **.    ** Ge
178e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
178f0 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
17900 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
17910 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
17920 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61  y.    ** table a
17930 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65  llocated and ope
17940 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 2a  ned above..    *
17950 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  /.    Select *pS
17960 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78  elect = pExpr->x
17970 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45 78  .pSelect;.    Ex
17980 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
17990 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
179a0 3b 0a 0a 20 20 20 20 45 78 70 6c 61 69 6e 51 75  ;..    ExplainQu
179b0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
179c0 20 31 2c 20 22 25 73 4c 49 53 54 20 53 55 42 51   1, "%sLIST SUBQ
179d0 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20  UERY %d",.      
179e0 20 20 61 64 64 72 4f 6e 63 65 3f 22 22 3a 22 43    addrOnce?"":"C
179f0 4f 52 52 45 4c 41 54 45 44 20 22 2c 20 70 53 65  ORRELATED ", pSe
17a00 6c 65 63 74 2d 3e 73 65 6c 49 64 0a 20 20 20 20  lect->selId.    
17a10 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ));.    /* If th
17a20 65 20 4c 48 53 20 61 6e 64 20 52 48 53 20 6f 66  e LHS and RHS of
17a30 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
17a40 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74   do not match, t
17a50 68 61 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  hat.    ** error
17a60 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
17a70 63 61 75 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f  caught long befo
17a80 72 65 20 77 65 20 72 65 61 63 68 20 74 68 69 73  re we reach this
17a90 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 69   point. */.    i
17aa0 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73 74  f( ALWAYS(pEList
17ab0 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29 20 29  ->nExpr==nVal) )
17ac0 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  {.      SelectDe
17ad0 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 69  st dest;.      i
17ae0 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt i;.      sqli
17af0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
17b00 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74  t(&dest, SRT_Set
17b10 2c 20 69 54 61 62 29 3b 0a 20 20 20 20 20 20 64  , iTab);.      d
17b20 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20 65  est.zAffSdst = e
17b30 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50  xprINAffinity(pP
17b40 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
17b50 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69      pSelect->iLi
17b60 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 74  mit = 0;.      t
17b70 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74  estcase( pSelect
17b80 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
17b90 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
17ba0 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65 79    testcase( pKey
17bb0 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61  Info==0 ); /* Ca
17bc0 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73  used by OOM in s
17bd0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
17be0 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 69 66  oc() */.      if
17bf0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
17c00 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
17c10 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
17c20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
17c30 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73  (pParse->db, des
17c40 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20  t.zAffSdst);.   
17c50 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
17c60 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
17c70 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  o);.        retu
17c80 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
17c90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17ca0 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74  pParse->db, dest
17cb0 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20  .zAffSdst);.    
17cc0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
17cd0 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20  fo!=0 ); /* OOM 
17ce0 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20  will cause exit 
17cf0 61 66 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c  after sqlite3Sel
17d00 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 61  ect() */.      a
17d10 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
17d20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17d30 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ( pEList->nExpr>
17d40 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
17d50 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
17d60 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
17d70 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
17d80 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b  for(i=0; i<nVal;
17d90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
17da0 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
17db0 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
17dc0 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  pr(pLeft, i);.  
17dd0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
17de0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  aColl[i] = sqlit
17df0 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
17e00 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20 20 20 20  ollSeq(.        
17e10 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70      pParse, p, p
17e20 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
17e30 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
17e40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
17e50 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
17e60 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29  xpr->x.pList!=0)
17e70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
17e80 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
17e90 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 2a 2a  exprlist).    **
17ea0 0a 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68  .    ** For each
17eb0 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69   expression, bui
17ec0 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ld an index key 
17ed0 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74  from the evaluat
17ee0 69 6f 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  ion and.    ** s
17ef0 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
17f00 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
17f10 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
17f20 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
17f30 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
17f40 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
17f50 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
17f60 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
17f70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61   is not.    ** a
17f80 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d   column, use num
17f90 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20  eric affinity.. 
17fa0 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61     */.    char a
17fb0 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20  ffinity;        
17fc0 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
17fd0 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  of the LHS of th
17fe0 65 20 49 4e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  e IN */.    int 
17ff0 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  i;.    ExprList 
18000 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
18010 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 73 74 72  x.pList;.    str
18020 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
18030 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e  m *pItem;.    in
18040 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 61 66  t r1, r2;.    af
18050 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
18060 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
18070 66 74 29 3b 0a 20 20 20 20 69 66 28 20 61 66 66  ft);.    if( aff
18080 69 6e 69 74 79 3c 3d 53 51 4c 49 54 45 5f 41 46  inity<=SQLITE_AF
18090 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  F_NONE ){.      
180a0 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
180b0 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
180c0 7d 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e  }.    if( pKeyIn
180d0 66 6f 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  fo ){.      asse
180e0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
180f0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
18100 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20  eyInfo) );.     
18110 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
18120 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70  [0] = sqlite3Exp
18130 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
18140 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
18150 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
18160 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
18170 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65  expression in <e
18180 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20  xprlist>. */.   
18190 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
181a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
181b0 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65  .    r2 = sqlite
181c0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
181d0 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  se);.    for(i=p
181e0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
181f0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
18200 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
18210 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32  .      Expr *pE2
18220 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
18230 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
18240 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
18250 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
18260 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
18270 6f 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62  o.      ** disab
18280 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61 74  le the test that
18290 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 61   was generated a
182a0 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20  bove that makes 
182b0 73 75 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  sure.      ** th
182c0 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65  is code only exe
182d0 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63  cutes once.  Bec
182e0 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63  ause for a non-c
182f0 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 2a 2a  onstant.      **
18300 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e   expression we n
18310 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69  eed to rerun thi
18320 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65  s code each time
18330 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18340 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 26 26   if( addrOnce &&
18350 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
18360 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
18370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18380 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
18390 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20  v, addrOnce);.  
183a0 20 20 20 20 20 20 45 78 70 72 43 6c 65 61 72 50        ExprClearP
183b0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
183c0 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20 20 20 20  P_Subrtn);.     
183d0 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b     addrOnce = 0;
183e0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
183f0 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
18400 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69  expression and i
18410 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
18420 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  e temp table */.
18430 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18440 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
18450 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
18460 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
18470 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
18480 2c 20 72 31 2c 20 31 2c 20 72 32 2c 20 26 61 66  , r1, 1, r2, &af
18490 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
184a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
184b0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
184c0 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 32  Insert, iTab, r2
184d0 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  , r1, 1);.    }.
184e0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
184f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18500 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r1);.    sqlit
18510 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18520 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
18530 7d 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  }.  if( pKeyInfo
18540 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
18550 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
18560 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65  ddr, (void *)pKe
18570 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
18580 4f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 64  O);.  }.  if( ad
18590 64 72 4f 6e 63 65 20 29 7b 0a 20 20 20 20 73 71  drOnce ){.    sq
185a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
185b0 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
185c0 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
185d0 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  e return */.    
185e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
185f0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
18600 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67  pExpr->y.sub.reg
18610 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 73 71 6c  Return);.    sql
18620 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
18630 28 76 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62  (v, pExpr->y.sub
18640 2e 69 41 64 64 72 2d 31 2c 20 73 71 6c 69 74 65  .iAddr-1, sqlite
18650 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
18660 28 76 29 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65  (v)-1);.  }.}.#e
18670 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
18680 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
18690 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
186a0 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
186b0 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
186c0 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78  as a subquery ex
186d0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6f 72 20 45  pression.** or E
186e0 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 3a 0a  XISTS operator:.
186f0 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
18700 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
18710 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
18720 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
18730 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
18740 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
18750 71 75 65 72 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20  query.**.** The 
18760 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
18770 69 73 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72  is the SELECT or
18780 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
18790 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2a   to be coded..**
187a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
187b0 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c  egister that hol
187c0 64 73 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20  ds the result.  
187d0 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75  For a multi-colu
187e0 6d 6e 20 53 45 4c 45 43 54 2c 20 0a 2a 2a 20 74  mn SELECT, .** t
187f0 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
18800 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75  red in a contigu
18810 6f 75 73 20 61 72 72 61 79 20 6f 66 20 72 65 67  ous array of reg
18820 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 0a 2a  isters and the.*
18830 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
18840 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6f  s the register o
18850 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  f the left-most 
18860 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 0a 2a  result column..*
18870 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 61 6e  * Return 0 if an
18880 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
18890 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
188a0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
188b0 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  nt sqlite3CodeSu
188c0 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  bselect(Parse *p
188d0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
188e0 70 72 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 4f  pr){.  int addrO
188f0 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nce = 0;        
18900 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
18910 20 4f 50 5f 4f 6e 63 65 20 61 74 20 74 6f 70 20   OP_Once at top 
18920 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  of subroutine */
18930 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b  .  int rReg = 0;
18940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18950 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69  * Register stori
18960 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a  ng resulting */.
18970 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18990 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
189a0 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
189b0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
189c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
189d0 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68  How to deal with
189e0 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a   SELECT result *
189f0 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20  /.  int nReg;   
18a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a10 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f 20  /* Registers to 
18a20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 45 78  allocate */.  Ex
18a30 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20  pr *pLimit;     
18a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
18a50 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f   limit expressio
18a60 6e 20 2a 2f 0a 0a 20 20 56 64 62 65 20 2a 76 20  n */..  Vdbe *v 
18a70 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
18a80 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
18a90 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
18aa0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
18ab0 53 54 53 20 29 3b 0a 20 20 74 65 73 74 63 61 73  STS );.  testcas
18ac0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
18ad0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 61 73 73  _SELECT );.  ass
18ae0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
18af0 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78  TK_EXISTS || pEx
18b00 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
18b10 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  T );.  assert( E
18b20 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
18b30 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
18b40 63 74 29 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20  ct) );.  pSel = 
18b50 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
18b60 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c  ;..  /* The eval
18b70 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  uation of the EX
18b80 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73 74  ISTS/SELECT must
18b90 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76 65   be repeated eve
18ba0 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20  ry time it.  ** 
18bb0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
18bc0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
18bd0 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a  lowing is true:.
18be0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20    **.  **    *  
18bf0 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
18c00 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ide is a correla
18c10 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a  ted subquery.  *
18c20 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
18c30 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
18c40 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
18c50 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72  t containing var
18c60 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a  iables.  **    *
18c70 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20    We are inside 
18c80 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20  a trigger.  **. 
18c90 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   ** If all of th
18ca0 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73  e above are fals
18cb0 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  e, then we can r
18cc0 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73  un this code jus
18cd0 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65  t once.  ** save
18ce0 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e   the results, an
18cf0 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  d reuse the same
18d00 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
18d10 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
18d20 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45  s..  */.  if( !E
18d30 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
18d40 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
18d50 63 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ct) ){.    /* If
18d60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   this routine ha
18d70 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
18d80 6f 64 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  oded, then invok
18d90 65 20 69 74 20 61 73 20 61 0a 20 20 20 20 2a 2a  e it as a.    **
18da0 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a   subroutine. */.
18db0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
18dc0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18dd0 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20 20 20  P_Subrtn) ){.   
18de0 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
18df0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20  lan((pParse, 0, 
18e00 22 52 45 55 53 45 20 53 55 42 51 55 45 52 59 20  "REUSE SUBQUERY 
18e10 25 64 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64  %d", pSel->selId
18e20 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
18e30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18e40 50 5f 47 6f 73 75 62 2c 20 70 45 78 70 72 2d 3e  P_Gosub, pExpr->
18e50 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 2c  y.sub.regReturn,
18e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18e70 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
18e80 79 2e 73 75 62 2e 69 41 64 64 72 29 3b 0a 20 20  y.sub.iAddr);.  
18e90 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
18ea0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  ->iTable;.    }.
18eb0 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f  .    /* Begin co
18ec0 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
18ed0 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 53  ine */.    ExprS
18ee0 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
18ef0 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20  , EP_Subrtn);.  
18f00 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72    pExpr->y.sub.r
18f10 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
18f20 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70  rse->nMem;.    p
18f30 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64  Expr->y.sub.iAdd
18f40 72 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r =.      sqlite
18f50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18f60 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 45  P_Integer, 0, pE
18f70 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65  xpr->y.sub.regRe
18f80 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20 20 56  turn) + 1;.    V
18f90 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
18fa0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 22 29  return address")
18fb0 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e 63 65  );..    addrOnce
18fc0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
18fd0 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
18fe0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
18ff0 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  );.  }.  .  /* F
19000 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e  or a SELECT, gen
19010 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
19020 74 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72  t the values for
19030 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   all columns of.
19040 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72    ** the first r
19050 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ow into an array
19060 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e   of registers an
19070 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64  d return the ind
19080 65 78 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66  ex of.  ** the f
19090 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20  irst register.. 
190a0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
190b0 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77   is an EXISTS, w
190c0 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20  rite an integer 
190d0 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f  0 (not exists) o
190e0 72 20 31 20 28 65 78 69 73 74 73 29 0a 20 20 2a  r 1 (exists).  *
190f0 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
19100 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  r and return tha
19110 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
19120 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  r..  **.  ** In 
19130 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20  both cases, the 
19140 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74  query is augment
19150 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31  ed with "LIMIT 1
19160 22 2e 20 20 41 6e 79 20 0a 20 20 2a 2a 20 70 72  ".  Any .  ** pr
19170 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20  eexisting limit 
19180 69 73 20 64 69 73 63 61 72 64 65 64 20 69 6e 20  is discarded in 
19190 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77  place of the new
191a0 20 4c 49 4d 49 54 20 31 2e 0a 20 20 2a 2f 0a 20   LIMIT 1..  */. 
191b0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
191c0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25  n((pParse, 1, "%
191d0 73 53 43 41 4c 41 52 20 53 55 42 51 55 45 52 59  sSCALAR SUBQUERY
191e0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 61 64   %d",.        ad
191f0 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45  drOnce?"":"CORRE
19200 4c 41 54 45 44 20 22 2c 20 70 53 65 6c 2d 3e 73  LATED ", pSel->s
19210 65 6c 49 64 29 29 3b 0a 20 20 6e 52 65 67 20 3d  elId));.  nReg =
19220 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
19230 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45  ELECT ? pSel->pE
19240 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b  List->nExpr : 1;
19250 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
19260 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
19270 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b  0, pParse->nMem+
19280 31 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  1);.  pParse->nM
19290 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 69 66  em += nReg;.  if
192a0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
192b0 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 64 65  SELECT ){.    de
192c0 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d  st.eDest = SRT_M
192d0 65 6d 3b 0a 20 20 20 20 64 65 73 74 2e 69 53 64  em;.    dest.iSd
192e0 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  st = dest.iSDPar
192f0 6d 3b 0a 20 20 20 20 64 65 73 74 2e 6e 53 64 73  m;.    dest.nSds
19300 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 73 71  t = nReg;.    sq
19310 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19320 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64  v, OP_Null, 0, d
19330 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73  est.iSDParm, des
19340 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31  t.iSDParm+nReg-1
19350 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
19360 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62  nt((v, "Init sub
19370 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
19380 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
19390 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45  st.eDest = SRT_E
193a0 78 69 73 74 73 3b 0a 20 20 20 20 73 71 6c 69 74  xists;.    sqlit
193b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
193c0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64  OP_Integer, 0, d
193d0 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20  est.iSDParm);.  
193e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
193f0 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72  , "Init EXISTS r
19400 65 73 75 6c 74 22 29 29 3b 0a 20 20 7d 0a 20 20  esult"));.  }.  
19410 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
19420 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
19430 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  ->db, TK_INTEGER
19440 2c 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65  ,&sqlite3IntToke
19450 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28  ns[1], 0);.  if(
19460 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSel->pLimit ){
19470 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19480 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
19490 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d  b, pSel->pLimit-
194a0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 53 65  >pLeft);.    pSe
194b0 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  l->pLimit->pLeft
194c0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 7d 65 6c   = pLimit;.  }el
194d0 73 65 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 4c  se{.    pSel->pL
194e0 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45  imit = sqlite3PE
194f0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c  xpr(pParse, TK_L
19500 49 4d 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30 29  IMIT, pLimit, 0)
19510 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 2d 3e 69 4c  ;.  }.  pSel->iL
19520 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  imit = 0;.  if( 
19530 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
19540 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73  arse, pSel, &des
19550 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
19560 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d   0;.  }.  pExpr-
19570 3e 69 54 61 62 6c 65 20 3d 20 72 52 65 67 20 3d  >iTable = rReg =
19580 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
19590 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
195a0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
195b0 52 65 64 75 63 65 29 3b 0a 20 20 69 66 28 20 61  Reduce);.  if( a
195c0 64 64 72 4f 6e 63 65 20 29 7b 0a 20 20 20 20 73  ddrOnce ){.    s
195d0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
195e0 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b  re(v, addrOnce);
195f0 0a 0a 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74  ..    /* Subrout
19600 69 6e 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  ine return */.  
19610 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19620 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
19630 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72  , pExpr->y.sub.r
19640 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 73  egReturn);.    s
19650 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
19660 50 31 28 76 2c 20 70 45 78 70 72 2d 3e 79 2e 73  P1(v, pExpr->y.s
19670 75 62 2e 69 41 64 64 72 2d 31 2c 20 73 71 6c 69  ub.iAddr-1, sqli
19680 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
19690 64 72 28 76 29 2d 31 29 3b 0a 20 20 7d 0a 0a 20  dr(v)-1);.  }.. 
196a0 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a   return rReg;.}.
196b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
196c0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
196d0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
196e0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
196f0 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69  /*.** Expr pIn i
19700 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70  s an IN(...) exp
19710 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75  ression. This fu
19720 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68  nction checks th
19730 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73  at the .** sub-s
19740 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53  elect on the RHS
19750 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65   of the IN() ope
19760 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73 61  rator has the sa
19770 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  me number of .**
19780 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20   columns as the 
19790 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48  vector on the LH
197a0 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48  S. Or, if the RH
197b0 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73  S of the IN() is
197c0 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71   not .** a sub-q
197d0 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c  uery, that the L
197e0 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f  HS is a vector o
197f0 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74  f size 1..*/.int
19800 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
19810 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73  kIN(Parse *pPars
19820 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  e, Expr *pIn){. 
19830 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73   int nVector = s
19840 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
19850 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29  Size(pIn->pLeft)
19860 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c  ;.  if( (pIn->fl
19870 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
19880 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ct) ){.    if( n
19890 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70  Vector!=pIn->x.p
198a0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
198b0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73  nExpr ){.      s
198c0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
198d0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49 6e  rror(pParse, pIn
198e0 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
198f0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63  ist->nExpr, nVec
19900 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tor);.      retu
19910 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 1;.    }.  }e
19920 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72 21  lse if( nVector!
19930 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
19940 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
19950 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65  pParse, pIn->pLe
19960 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ft);.    return 
19970 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
19980 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
19990 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
199a0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
199b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
199c0 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69  r an IN expressi
199d0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  on..**.**      x
199e0 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
199f0 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76  .**      x IN (v
19a00 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
19a10 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ).**.** The left
19a20 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29  -hand side (LHS)
19a30 20 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72 20   is a scalar or 
19a40 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  vector expressio
19a50 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67 68  n.  The .** righ
19a60 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53  t-hand side (RHS
19a70 29 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  ) is an array of
19a80 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63   zero or more sc
19a90 61 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72 20  alar values, or 
19aa0 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20 20  a.** subquery.  
19ab0 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  If the RHS is a 
19ac0 73 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e 75  subquery, the nu
19ad0 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
19ae0 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d  olumns must.** m
19af0 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
19b00 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
19b10 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20  e vector on the 
19b20 4c 48 53 2e 20 20 49 66 20 74 68 65 20 52 48 53  LHS.  If the RHS
19b30 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66   is.** a list of
19b40 20 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48 53   values, the LHS
19b50 20 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c 61   must be a scala
19b60 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e  r. .**.** The IN
19b70 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72 75   operator is tru
19b80 65 20 69 66 20 74 68 65 20 4c 48 53 20 76 61 6c  e if the LHS val
19b90 75 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ue is contained 
19ba0 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 0a  within the RHS..
19bb0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
19bc0 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48   false if the LH
19bd0 53 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20  S is definitely 
19be0 6e 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e 20  not in the RHS. 
19bf0 20 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20   The .** result 
19c00 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  is NULL if the p
19c10 72 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20 4c  resence of the L
19c20 48 53 20 69 6e 20 74 68 65 20 52 48 53 20 63 61  HS in the RHS ca
19c30 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74 65  nnot be .** dete
19c40 72 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e 55  rmined due to NU
19c50 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  LLs..**.** This 
19c60 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
19c70 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70  s code that jump
19c80 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65  s to destIfFalse
19c90 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
19ca0 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64  ot .** contained
19cb0 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
19cc0 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c    If due to NULL
19cd0 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  s we cannot dete
19ce0 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53  rmine if the LHS
19cf0 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  .** is contained
19d00 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
19d10 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e   jump to destIfN
19d20 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53  ull.  If the LHS
19d30 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a   is contained.**
19d40 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
19d50 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
19d60 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65  h..**.** See the
19d70 20 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70 65   separate in-ope
19d80 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e  rator.md documen
19d90 74 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74  tation file in t
19da0 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20  he canonical.** 
19db0 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72  SQLite source tr
19dc0 65 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ee for additiona
19dd0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
19de0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
19df0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
19e00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
19e10 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
19e20 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
19e30 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
19e40 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
19e50 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
19e60 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  e IN expression 
19e70 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46  */.  int destIfF
19e80 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75  alse,      /* Ju
19e90 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69  mp here if LHS i
19ea0 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
19eb0 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  in the RHS */.  
19ec0 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20  int destIfNull  
19ed0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
19ee0 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  re if the result
19ef0 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75  s are unknown du
19f00 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b  e to NULLs */.){
19f10 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75  .  int rRhsHasNu
19f20 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69  ll = 0;  /* Regi
19f30 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75  ster that is tru
19f40 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e  e if RHS contain
19f50 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f  s NULL values */
19f60 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
19f70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
19f80 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   of the RHS */. 
19f90 20 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20 20   int rLhs;      
19fa0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
19fb0 65 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74 68  er(s) holding th
19fc0 65 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a  e LHS values */.
19fd0 20 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20    int rLhsOrig; 
19fe0 20 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 76          /* LHS v
19ff0 61 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20 72  alues prior to r
1a000 65 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69 4d  eordering by aiM
1a010 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ap[] */.  Vdbe *
1a020 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1a030 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64  /* Statement und
1a040 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1a050 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20  */.  int *aiMap 
1a060 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  = 0;       /* Ma
1a070 70 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69  p from vector fi
1a080 65 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c  eld to index col
1a090 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  umn */.  char *z
1a0a0 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Aff = 0;       /
1a0b0 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
1a0c0 67 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  g for comparison
1a0d0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74  s */.  int nVect
1a0e0 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or;          /* 
1a0f0 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20  Size of vectors 
1a100 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72  for this IN oper
1a110 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44  ator */.  int iD
1a120 75 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20 20  ummy;           
1a130 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65 74  /* Dummy paramet
1a140 65 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56 65  er to exprCodeVe
1a150 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70 72  ctor() */.  Expr
1a160 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
1a170 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
1a180 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
1a190 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1a1a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
1a1b0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1a1c0 69 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20 20  int destStep2;  
1a1d0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
1a1e0 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c  o jump when NULL
1a1f0 73 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20 32  s seen in step 2
1a200 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74   */.  int destSt
1a210 65 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53  ep6 = 0;    /* S
1a220 74 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f 72  tart of code for
1a230 20 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74   Step 6 */.  int
1a240 20 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20 20   addrTruthOp;   
1a250 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1a260 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65 74   opcode that det
1a270 65 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20 69  ermines the IN i
1a280 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  s true */.  int 
1a290 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20  destNotNull;    
1a2a0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1a2b0 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  f a comparison i
1a2c0 73 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73 74  s not true in st
1a2d0 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ep 6 */.  int ad
1a2e0 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
1a2f0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73 74  /* Top of the st
1a300 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 20 20  ep-6 loop */ .  
1a310 69 6e 74 20 69 54 61 62 20 3d 20 30 3b 20 20 20  int iTab = 0;   
1a320 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
1a330 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 70 4c 65 66  o use */..  pLef
1a340 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
1a350 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
1a360 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73  xprCheckIN(pPars
1a370 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74 75  e, pExpr) ) retu
1a380 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70  rn;.  zAff = exp
1a390 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72  rINAffinity(pPar
1a3a0 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56  se, pExpr);.  nV
1a3b0 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45  ector = sqlite3E
1a3c0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
1a3d0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61  xpr->pLeft);.  a
1a3e0 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c  iMap = (int*)sql
1a3f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1a400 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  (.      pParse->
1a410 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a  db, nVector*(siz
1a420 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f  eof(int) + sizeo
1a430 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29  f(char)) + 1.  )
1a440 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1a450 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a460 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45   ) goto sqlite3E
1a470 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72  xprCodeIN_oom_er
1a480 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d  ror;..  /* Attem
1a490 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  pt to compute th
1a4a0 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69  e RHS. After thi
1a4b0 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68  s step, if anyth
1a4c0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20  ing other than. 
1a4d0 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   ** IN_INDEX_NOO
1a4e0 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  P is returned, t
1a4f0 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20  he table opened 
1a500 77 69 74 68 20 63 75 72 73 6f 72 20 69 54 61 62  with cursor iTab
1a510 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  .  ** contains t
1a520 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
1a530 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 20  ake up the RHS. 
1a540 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  If IN_INDEX_NOOP
1a550 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20   is returned,.  
1a560 2a 2a 20 74 68 65 20 52 48 53 20 68 61 73 20 6e  ** the RHS has n
1a570 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65  ot yet been code
1a580 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61  d.  */.  v = pPa
1a590 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
1a5a0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
1a5b0 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63      /* OOM detec
1a5c0 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69  ted prior to thi
1a5d0 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56  s routine */.  V
1a5e0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1a5f0 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70  v, "begin IN exp
1a600 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20  r"));.  eType = 
1a610 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
1a620 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ex(pParse, pExpr
1a630 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
1a650 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
1a660 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  IP | IN_INDEX_NO
1a670 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20  OP_OK,.         
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d      destIfFalse=
1a6a0 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20  =destIfNull ? 0 
1a6b0 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c 0a  : &rRhsHasNull,.
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 69 4d               aiM
1a6e0 61 70 2c 20 26 69 54 61 62 29 3b 0a 0a 20 20 61  ap, &iTab);..  a
1a6f0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1a700 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d  Err || nVector==
1a710 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  1 || eType==IN_I
1a720 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20 20  NDEX_EPH.       
1a730 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  || eType==IN_IND
1a740 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20  EX_INDEX_ASC || 
1a750 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1a760 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29 3b  INDEX_DESC .  );
1a770 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1a780 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72  EBUG.  /* Confir
1a790 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20 63  m that aiMap[] c
1a7a0 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72 20  ontains nVector 
1a7b0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 62  integer values b
1a7c0 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a  etween 0 and.  *
1a7d0 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a  * nVector-1. */.
1a7e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
1a7f0 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
1a800 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20  int j, cnt;.    
1a810 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e  for(cnt=j=0; j<n
1a820 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28  Vector; j++) if(
1a830 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63   aiMap[j]==i ) c
1a840 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  nt++;.    assert
1a850 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a  ( cnt==1 );.  }.
1a860 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64  #endif..  /* Cod
1a870 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c  e the LHS, the <
1a880 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
1a890 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66  r> IN (...)". If
1a8a0 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20   the LHS is a . 
1a8b0 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e   ** vector, then
1a8c0 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e   it is stored in
1a8d0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65   an array of nVe
1a8e0 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 73  ctor registers s
1a8f0 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74  tarting .  ** at
1a900 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73   r1..  **.  ** s
1a910 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
1a920 78 28 29 20 6d 69 67 68 74 20 68 61 76 65 20 72  x() might have r
1a930 65 6f 72 64 65 72 65 64 20 74 68 65 20 66 69 65  eordered the fie
1a940 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20 76  lds of the LHS v
1a950 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68  ector.  ** so th
1a960 61 74 20 74 68 65 20 66 69 65 6c 64 73 20 61 72  at the fields ar
1a970 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72  e in the same or
1a980 64 65 72 20 61 73 20 61 6e 20 65 78 69 73 74 69  der as an existi
1a990 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65 0a  ng index.   The.
1a9a0 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72    ** aiMap[] arr
1a9b0 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  ay contains a ma
1a9c0 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f  pping from the o
1a9d0 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c  riginal LHS fiel
1a9e0 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  d order to.  ** 
1a9f0 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72 20  the field order 
1aa00 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
1aa10 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f   RHS index..  */
1aa20 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65 78  .  rLhsOrig = ex
1aa30 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
1aa40 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75  rse, pLeft, &iDu
1aa50 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  mmy);.  for(i=0;
1aa60 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61 69   i<nVector && ai
1aa70 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b  Map[i]==i; i++){
1aa80 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69 65  } /* Are LHS fie
1aa90 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20 2a  lds reordered? *
1aaa0 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63 74  /.  if( i==nVect
1aab0 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53  or ){.    /* LHS
1aac0 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20   fields are not 
1aad0 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  reordered */.   
1aae0 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69 67   rLhs = rLhsOrig
1aaf0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1ab00 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64 65  * Need to reorde
1ab10 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64 73  r the LHS fields
1ab20 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 69   according to ai
1ab30 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20  Map */.    rLhs 
1ab40 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1ab50 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56  Range(pParse, nV
1ab60 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28  ector);.    for(
1ab70 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
1ab80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1ab90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1aba0 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72   OP_Copy, rLhsOr
1abb0 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70  ig+i, rLhs+aiMap
1abc0 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  [i], 0);.    }. 
1abd0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69   }..  /* If sqli
1abe0 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29  te3FindInIndex()
1abf0 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72   did not find or
1ac00 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
1ac10 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75   that is.  ** su
1ac20 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75  itable for evalu
1ac30 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65  ating the IN ope
1ac40 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c  rator, then eval
1ac50 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a  uate using a.  *
1ac60 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f  * sequence of co
1ac70 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a  mparisons..  **.
1ac80 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74 65    ** This is ste
1ac90 70 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e 2d  p (1) in the in-
1aca0 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69  operator.md opti
1acb0 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e  mized algorithm.
1acc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1acd0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  e==IN_INDEX_NOOP
1ace0 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
1acf0 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
1ad00 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f  >x.pList;.    Co
1ad10 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
1ad20 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1ad30 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
1ad40 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74  >pLeft);.    int
1ad50 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74   labelOk = sqlit
1ad60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1ad70 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 6e 74  pParse);.    int
1ad80 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a   r2, regToFree;.
1ad90 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c      int regCkNul
1ada0 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
1adb0 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  i;.    assert( !
1adc0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1add0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1ade0 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
1adf0 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
1ae00 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
1ae10 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c   regCkNull = sql
1ae20 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1ae30 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1ae40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1ae50 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c  v, OP_BitAnd, rL
1ae60 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e  hs, rLhs, regCkN
1ae70 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ull);.    }.    
1ae80 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69  for(ii=0; ii<pLi
1ae90 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  st->nExpr; ii++)
1aea0 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  {.      r2 = sql
1aeb0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1aec0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
1aed0 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65  a[ii].pExpr, &re
1aee0 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  gToFree);.      
1aef0 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26  if( regCkNull &&
1af00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
1af10 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69  eNull(pList->a[i
1af20 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
1af30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1af40 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74  AddOp3(v, OP_Bit
1af50 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  And, regCkNull, 
1af60 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  r2, regCkNull);.
1af70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1af80 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ( ii<pList->nExp
1af90 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c  r-1 || destIfNul
1afa0 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l!=destIfFalse )
1afb0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1afc0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1afd0 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65  P_Eq, rLhs, labe
1afe0 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lOk, r2,.       
1aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b000 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
1b010 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
1b020 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b030 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74  geIf(v, ii<pList
1b040 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
1b050 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1b060 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d  If(v, ii==pList-
1b070 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
1b080 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1b090 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30  angeP5(v, zAff[0
1b0a0 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
1b0b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1b0c0 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
1b0d0 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20  tIfFalse );.    
1b0e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b0f0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp4(v, OP_Ne, 
1b100 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73  rLhs, destIfFals
1b110 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  e, r2,.         
1b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b130 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
1b140 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65  4_COLLSEQ); Vdbe
1b150 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1b160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b170 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
1b180 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  [0] | SQLITE_JUM
1b190 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1b1a0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
1b1b0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1b1c0 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29  arse, regToFree)
1b1d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b1e0 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20  regCkNull ){.   
1b1f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b200 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
1b210 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65  l, regCkNull, de
1b220 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43  stIfNull); VdbeC
1b230 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1b240 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1b250 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  o(v, destIfFalse
1b260 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1b270 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1b280 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29  abel(v, labelOk)
1b290 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1b2a0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1b2b0 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  se, regCkNull);.
1b2c0 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33      goto sqlite3
1b2d0 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
1b2e0 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  hed;.  }..  /* S
1b2f0 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20  tep 2: Check to 
1b300 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 63  see if the LHS c
1b310 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
1b320 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68   columns.  If th
1b330 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20  e.  ** LHS does 
1b340 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68  contain NULLs th
1b350 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
1b360 73 74 20 62 65 20 65 69 74 68 65 72 20 46 41 4c  st be either FAL
1b370 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  SE or NULL..  **
1b380 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b   We will then sk
1b390 69 70 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  ip the binary se
1b3a0 61 72 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e  arch of the RHS.
1b3b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
1b3c0 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
1b3d0 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53  lse ){.    destS
1b3e0 74 65 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c  tep2 = destIfFal
1b3f0 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  se;.  }else{.   
1b400 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73   destStep2 = des
1b410 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33  tStep6 = sqlite3
1b420 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
1b430 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  arse);.  }.  for
1b440 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1b450 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
1b460 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  *p = sqlite3Vect
1b470 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
1b480 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b  Expr->pLeft, i);
1b490 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1b4a0 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29  ExprCanBeNull(p)
1b4b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1b4c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b4d0 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69  P_IsNull, rLhs+i
1b4e0 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20  , destStep2);.  
1b4f0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1b500 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  (v);.    }.  }..
1b510 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68    /* Step 3.  Th
1b520 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f  e LHS is now kno
1b530 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c  wn to be non-NUL
1b540 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72  L.  Do the binar
1b550 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66  y search.  ** of
1b560 20 74 68 65 20 52 48 53 20 75 73 69 6e 67 20 74   the RHS using t
1b570 68 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62  he LHS as a prob
1b580 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68  e.  If found, th
1b590 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a  e result is.  **
1b5a0 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   true..  */.  if
1b5b0 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
1b5c0 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f  X_ROWID ){.    /
1b5d0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
1b5e0 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52  the RHS is the R
1b5f0 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d  OWID of table b-
1b600 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61  tree and so we a
1b610 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20  lso.    ** know 
1b620 74 68 61 74 20 74 68 65 20 52 48 53 20 69 73 20  that the RHS is 
1b630 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65  non-NULL.  Hence
1b640 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65  , we combine ste
1b650 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a  ps 3 and 4.    *
1b660 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  * into a single 
1b670 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73  opcode. */.    s
1b680 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b690 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  (v, OP_SeekRowid
1b6a0 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66 46 61  , iTab, destIfFa
1b6b0 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20  lse, rLhs);.    
1b6c0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b6d0 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70  .    addrTruthOp
1b6e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b6f0 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
1b700 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75  ;  /* Return Tru
1b710 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e */.  }else{.  
1b720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b730 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op4(v, OP_Affini
1b740 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f  ty, rLhs, nVecto
1b750 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63  r, 0, zAff, nVec
1b760 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65  tor);.    if( de
1b770 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
1b780 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f  fNull ){.      /
1b790 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33  * Combine Step 3
1b7a0 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f   and Step 5 into
1b7b0 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
1b7c0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1b7d0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1b7e0 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69  , OP_NotFound, i
1b7f0 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73 65  Tab, destIfFalse
1b800 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68               rLh
1b820 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62  s, nVector); Vdb
1b830 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b840 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33      goto sqlite3
1b850 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
1b860 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  hed;.    }.    /
1b870 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20  * Ordinary Step 
1b880 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  3, for the case 
1b890 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20  where FALSE and 
1b8a0 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63  NULL are distinc
1b8b0 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75  t */.    addrTru
1b8c0 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  thOp = sqlite3Vd
1b8d0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
1b8e0 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 30  P_Found, iTab, 0
1b8f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56          rLhs, nV
1b920 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65  ector); VdbeCove
1b930 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
1b940 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66 20 74  /* Step 4.  If t
1b950 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20  he RHS is known 
1b960 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  to be non-NULL a
1b970 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69  nd we did not fi
1b980 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68  nd.  ** an match
1b990 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 20 61   on the search a
1b9a0 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
1b9b0 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41  esult must be FA
1b9c0 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  LSE..  */.  if( 
1b9d0 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e  rRhsHasNull && n
1b9e0 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20  Vector==1 ){.   
1b9f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ba00 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p2(v, OP_NotNull
1ba10 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64  , rRhsHasNull, d
1ba20 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
1ba30 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1ba40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  ;.  }..  /* Step
1ba50 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f   5.  If we do no
1ba60 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
1ba70 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
1ba80 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a  een NULL and.  *
1ba90 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75  * FALSE, then ju
1baa0 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  st return false.
1bab0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73   .  */.  if( des
1bac0 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
1bad0 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64  Null ) sqlite3Vd
1bae0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66  beGoto(v, destIf
1baf0 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74  False);..  /* St
1bb00 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75  ep 6: Loop throu
1bb10 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52  gh rows of the R
1bb20 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63  HS.  Compare eac
1bb30 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53  h row to the LHS
1bb40 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f  ..  ** If any co
1bb50 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c  mparison is NULL
1bb60 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
1bb70 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61  t is NULL.  If a
1bb80 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73  ll.  ** comparis
1bb90 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20 74 68  ons are FALSE th
1bba0 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73  en the final res
1bbb0 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20  ult is FALSE..  
1bbc0 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63  **.  ** For a sc
1bbd0 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20  alar LHS, it is 
1bbe0 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68  sufficient to ch
1bbf0 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72  eck just the fir
1bc00 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74  st row.  ** of t
1bc10 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69  he RHS..  */.  i
1bc20 66 28 20 64 65 73 74 53 74 65 70 36 20 29 20 73  f( destStep6 ) s
1bc30 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1bc40 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74  eLabel(v, destSt
1bc50 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20  ep6);.  addrTop 
1bc60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1bc70 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
1bc80 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66 46 61  , iTab, destIfFa
1bc90 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  lse);.  VdbeCove
1bca0 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e  rage(v);.  if( n
1bcb0 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Vector>1 ){.    
1bcc0 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71  destNotNull = sq
1bcd0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1bce0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 65  el(pParse);.  }e
1bcf0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20  lse{.    /* For 
1bd00 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62  nVector==1, comb
1bd10 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e 64 20  ine steps 6 and 
1bd20 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65 6c 79  7 by immediately
1bd30 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a   returning.    *
1bd40 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 66  * FALSE if the f
1bd50 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  irst comparison 
1bd60 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20  is not NULL */. 
1bd70 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d     destNotNull =
1bd80 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20   destIfFalse;.  
1bd90 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
1bda0 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
1bdb0 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 43    Expr *p;.    C
1bdc0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
1bdd0 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71 6c 69     int r3 = sqli
1bde0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1bdf0 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d 20 73  arse);.    p = s
1be00 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
1be10 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
1be20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  i);.    pColl = 
1be30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1be40 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
1be50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1be60 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1be70 6e 2c 20 69 54 61 62 2c 20 69 2c 20 72 33 29 3b  n, iTab, i, r3);
1be80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1be90 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
1bea0 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74   rLhs+i, destNot
1beb0 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20  Null, r3,.      
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bed0 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
1bee0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56  _COLLSEQ);.    V
1bef0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1bf00 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1bf10 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1bf20 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  , r3);.  }.  sql
1bf30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1bf40 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
1bf50 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28  stIfNull);.  if(
1bf60 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20   nVector>1 ){.  
1bf70 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1bf80 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1bf90 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  tNotNull);.    s
1bfa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1bfb0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
1bfc0 62 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  b, addrTop+1);. 
1bfd0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1bfe0 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70  v);..    /* Step
1bff0 20 37 3a 20 20 49 66 20 77 65 20 72 65 61 63 68   7:  If we reach
1c000 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
1c010 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72 65  know that the re
1c020 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a  sult must.    **
1c030 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20   be false. */.  
1c040 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c050 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1c060 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  0, destIfFalse);
1c070 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73  .  }..  /* Jumps
1c080 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74   here in order t
1c090 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a  o return true. *
1c0a0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
1c0b0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
1c0c0 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65  ruthOp);..sqlite
1c0d0 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
1c0e0 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73  shed:.  if( rLhs
1c0f0 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c  !=rLhsOrig ) sql
1c100 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1c110 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29  eg(pParse, rLhs)
1c120 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
1c130 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72  (v, "end IN expr
1c140 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72  "));.sqlite3Expr
1c150 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72  CodeIN_oom_error
1c160 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
1c170 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69  e(pParse->db, ai
1c180 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Map);.  sqlite3D
1c190 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
1c1a0 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69  , zAff);.}.#endi
1c1b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1c1c0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
1c1d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c1e0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1c1f0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1c200 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
1c210 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
1c220 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
1c230 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
1c240 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
1c250 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
1c260 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
1c270 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
1c280 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
1c290 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
1c2a0 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
1c2b0 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
1c2c0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
1c2d0 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
1c2e0 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
1c2f0 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
1c300 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
1c310 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1c320 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
1c330 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
1c340 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c  *z, int negateFl
1c350 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
1c360 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30   if( ALWAYS(z!=0
1c370 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
1c380 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  value;.    sqlit
1c390 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65  e3AtoF(z, &value
1c3a0 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
1c3b0 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
1c3c0 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  8);.    assert( 
1c3d0 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61  !sqlite3IsNaN(va
1c3e0 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e  lue) ); /* The n
1c3f0 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65  ew AtoF never re
1c400 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20  turns NaN */.   
1c410 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20   if( negateFlag 
1c420 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
1c430 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c440 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
1c450 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
1c460 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c   0, (u8*)&value,
1c470 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d   P4_REAL);.  }.}
1c480 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1c490 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
1c4a0 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
1c4b0 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
1c4c0 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
1c4d0 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
1c4e0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
1c4f0 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75  em..**.** Expr.u
1c500 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79  .zToken is alway
1c510 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d  s UTF8 and zero-
1c520 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73  terminated..*/.s
1c530 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
1c540 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50  nteger(Parse *pP
1c550 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1c560 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20  r, int negFlag, 
1c570 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62  int iMem){.  Vdb
1c580 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1c590 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70  Vdbe;.  if( pExp
1c5a0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
1c5b0 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
1c5c0 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
1c5d0 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72  Value;.    asser
1c5e0 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  t( i>=0 );.    i
1c5f0 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d  f( negFlag ) i =
1c600 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -i;.    sqlite3
1c610 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c620 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65  _Integer, i, iMe
1c630 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
1c640 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20   int c;.    i64 
1c650 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74  value;.    const
1c660 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72   char *z = pExpr
1c670 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1c680 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
1c690 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44      c = sqlite3D
1c6a0 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20  ecOrHexToI64(z, 
1c6b0 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28  &value);.    if(
1c6c0 20 28 63 3d 3d 33 20 26 26 20 21 6e 65 67 46 6c   (c==3 && !negFl
1c6d0 61 67 29 20 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c  ag) || (c==2) ||
1c6e0 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76 61 6c   (negFlag && val
1c6f0 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  ue==SMALLEST_INT
1c700 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  64)){.#ifdef SQL
1c710 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1c720 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71  G_POINT.      sq
1c730 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1c740 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64  arse, "oversized
1c750 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c   integer: %s%s",
1c760 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a   negFlag ? "-" :
1c770 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23   "", z);.#else.#
1c780 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c790 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20  IT_HEX_INTEGER. 
1c7a0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1c7b0 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22  _strnicmp(z,"0x"
1c7c0 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,2)==0 ){.      
1c7d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c7e0 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c  g(pParse, "hex l
1c7f0 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20  iteral too big: 
1c800 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22  %s%s", negFlag?"
1c810 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20  -":"",z);.      
1c820 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
1c830 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64     {.        cod
1c840 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46  eReal(v, z, negF
1c850 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  lag, iMem);.    
1c860 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1c870 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
1c880 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65  negFlag ){ value
1c890 20 3d 20 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45   = c==3 ? SMALLE
1c8a0 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75  ST_INT64 : -valu
1c8b0 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74  e; }.      sqlit
1c8c0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1c8d0 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
1c8e0 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26   iMem, 0, (u8*)&
1c8f0 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29  value, P4_INT64)
1c900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
1c910 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1c920 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20   that will load 
1c930 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72 65  into register re
1c940 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68 61  gOut a value tha
1c950 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69  t is.** appropri
1c960 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64 78  ate for the iIdx
1c970 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
1c980 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a   index pIdx..*/.
1c990 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1c9a0 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c  CodeLoadIndexCol
1c9b0 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
1c9c0 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61  arse,  /* The pa
1c9d0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1c9e0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
1c9f0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
1ca00 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20  whose column is 
1ca10 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a  to be loaded */.
1ca20 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
1ca30 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
1ca40 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  ting to a table 
1ca50 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  row */.  int iId
1ca60 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20  xCol,    /* The 
1ca70 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
1ca80 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64  dex to be loaded
1ca90 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
1caa0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
1cab0 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  he index column 
1cac0 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
1cad0 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  gister */.){.  i
1cae0 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64  16 iTabCol = pId
1caf0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78  x->aiColumn[iIdx
1cb00 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62  Col];.  if( iTab
1cb10 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a  Col==XN_EXPR ){.
1cb20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1cb30 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20  ->aColExpr );.  
1cb40 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
1cb50 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e  aColExpr->nExpr>
1cb60 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70  iIdxCol );.    p
1cb70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1cb80 3d 20 69 54 61 62 43 75 72 20 2b 20 31 3b 0a 20  = iTabCur + 1;. 
1cb90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1cba0 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70  deCopy(pParse, p
1cbb0 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
1cbc0 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c  [iIdxCol].pExpr,
1cbd0 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 70 50   regOut);.    pP
1cbe0 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
1cbf0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1cc00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1cc10 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1cc20 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1cc30 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54  pIdx->pTable, iT
1cc40 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  abCur,.         
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc60 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62 43             iTabC
1cc70 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
1cc80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1cc90 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  te code to extra
1cca0 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
1ccb0 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
1ccc0 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a  mn of a table..*
1ccd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1cce0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
1ccf0 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a  fTable(.  Vdbe *
1cd00 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  v,        /* The
1cd10 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
1cd20 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61  truction */.  Ta
1cd30 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a  ble *pTab,    /*
1cd40 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   The table conta
1cd50 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
1cd60 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72  */.  int iTabCur
1cd70 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
1cd80 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68  e cursor.  Or th
1cd90 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20  e PK cursor for 
1cda0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f  WITHOUT ROWID */
1cdb0 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
1cdc0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1cdd0 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74  he column to ext
1cde0 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ract */.  int re
1cdf0 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74  gOut      /* Ext
1ce00 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69  ract the value i
1ce10 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65  nto this registe
1ce20 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 54  r */.){.  if( pT
1ce30 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ab==0 ){.    sql
1ce40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1ce50 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61  , OP_Column, iTa
1ce60 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f  bCur, iCol, regO
1ce70 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ut);.    return;
1ce80 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3c  .  }.  if( iCol<
1ce90 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d  0 || iCol==pTab-
1cea0 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  >iPKey ){.    sq
1ceb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1cec0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
1ced0 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCur, regOut);. 
1cee0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1cef0 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70  op = IsVirtual(p
1cf00 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d  Tab) ? OP_VColum
1cf10 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20  n : OP_Column;. 
1cf20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b     int x = iCol;
1cf30 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
1cf40 69 64 28 70 54 61 62 29 20 26 26 20 21 49 73 56  id(pTab) && !IsV
1cf50 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
1cf60 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
1cf70 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73  3ColumnOfIndex(s
1cf80 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
1cf90 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f  Index(pTab), iCo
1cfa0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
1cfb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cfc0 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20  v, op, iTabCur, 
1cfd0 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  x, regOut);.  }.
1cfe0 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
1cff0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
1d000 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61  mnDefault(v, pTa
1d010 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29  b, iCol, regOut)
1d020 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
1d030 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1d040 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74  t will extract t
1d050 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
1d060 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62  lumn from.** tab
1d070 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72  le pTab and stor
1d080 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
1d090 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
1d0a0 52 65 67 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72  Reg. .**.** Ther
1d0b0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
1d0c0 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
1d0d0 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
1d0e0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1d0f0 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
1d100 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
1d110 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
1d120 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
1d130 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20  e rowid..*/.int 
1d140 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1d150 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
1d160 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
1d170 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
1d180 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
1d190 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
1d1a0 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
1d1b0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1d1c0 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
1d1d0 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
1d1e0 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
1d1f0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1d200 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
1d210 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1d220 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1d230 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1d240 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1d250 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
1d260 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
1d270 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20  re */.  u8 p5   
1d280 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76           /* P5 v
1d290 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75  alue for OP_Colu
1d2a0 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b  mn + FLAGS */.){
1d2b0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1d2c0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
1d2d0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
1d2e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1d2f0 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1d300 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c  v, pTab, iTable,
1d310 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
1d320 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20  .  if( p5 ){.   
1d330 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1d340 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d  geP5(v, p5);.  }
1d350 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
1d360 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1d370 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63  e code to move c
1d380 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69  ontent from regi
1d390 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46  sters iFrom...iF
1d3a0 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76  rom+nReg-1.** ov
1d3b0 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e  er to iTo..iTo+n
1d3c0 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Reg-1..*/.void s
1d3d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
1d3e0 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
1d3f0 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
1d400 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b   iTo, int nReg){
1d410 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d  .  assert( iFrom
1d420 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46  >=iTo+nReg || iF
1d430 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b  rom+nReg<=iTo );
1d440 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1d450 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
1d460 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
1d470 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a  om, iTo, nReg);.
1d480 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
1d490 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
1d4a0 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54  sion node to a T
1d4b0 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66 65 72  K_REGISTER refer
1d4c0 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74  encing.** regist
1d4d0 65 72 20 69 52 65 67 2e 20 20 54 68 65 20 63 61  er iReg.  The ca
1d4e0 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
1d4f0 20 74 68 61 74 20 69 52 65 67 20 61 6c 72 65 61   that iReg alrea
1d500 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  dy contains.** t
1d510 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
1d520 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
1d530 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1d540 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73 74  oid exprToRegist
1d550 65 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  er(Expr *pExpr, 
1d560 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 45 78 70  int iReg){.  Exp
1d570 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
1d580 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64  prSkipCollateAnd
1d590 4c 69 6b 65 6c 79 28 70 45 78 70 72 29 3b 0a 20  Likely(pExpr);. 
1d5a0 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b   p->op2 = p->op;
1d5b0 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  .  p->op = TK_RE
1d5c0 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61  GISTER;.  p->iTa
1d5d0 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78  ble = iReg;.  Ex
1d5e0 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
1d5f0 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a  p, EP_Skip);.}..
1d600 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61  /*.** Evaluate a
1d610 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69  n expression (ei
1d620 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72  ther a vector or
1d630 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
1d640 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a  sion) and store.
1d650 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  ** the result in
1d660 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d   continguous tem
1d670 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
1d680 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1d690 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  dex of.** the fi
1d6a0 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73 65  rst register use
1d6b0 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  d to store the r
1d6c0 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  esult..**.** If 
1d6d0 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73  the returned res
1d6e0 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
1d6f0 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c  a temporary scal
1d700 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  ar, then also wr
1d710 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69  ite.** that regi
1d720 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f  ster number into
1d730 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49   *piFreeable.  I
1d740 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1d750 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a  esult register.*
1d760 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  * is not a tempo
1d770 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20 65  rary or if the e
1d780 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
1d790 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65  ector set *piFre
1d7a0 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a  eable.** to 0..*
1d7b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
1d7c0 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
1d7d0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1d7e0 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61  *p, int *piFreea
1d7f0 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73  ble){.  int iRes
1d800 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75  ult;.  int nResu
1d810 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
1d820 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20  VectorSize(p);. 
1d830 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20   if( nResult==1 
1d840 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d  ){.    iResult =
1d850 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d860 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Temp(pParse, p, 
1d870 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d  piFreeable);.  }
1d880 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65  else{.    *piFre
1d890 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69  eable = 0;.    i
1d8a0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  f( p->op==TK_SEL
1d8b0 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ECT ){.#if SQLIT
1d8c0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1d8d0 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20        iResult = 
1d8e0 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  0;.#else.      i
1d8f0 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
1d900 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
1d910 61 72 73 65 2c 20 70 29 3b 0a 23 65 6e 64 69 66  arse, p);.#endif
1d920 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d930 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
1d940 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d  Result = pParse-
1d950 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70  >nMem+1;.      p
1d960 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1d970 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f  Result;.      fo
1d980 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74  r(i=0; i<nResult
1d990 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1d9a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46  sqlite3ExprCodeF
1d9b0 61 63 74 6f 72 61 62 6c 65 28 70 50 61 72 73 65  actorable(pParse
1d9c0 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  , p->x.pList->a[
1d9d0 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52 65 73  i].pExpr, i+iRes
1d9e0 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ult);.      }.  
1d9f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1da00 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a   iResult;.}.../*
1da10 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1da20 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  e into the curre
1da30 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75  nt Vdbe to evalu
1da40 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ate the given.**
1da50 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74   expression.  At
1da60 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74  tempt to store t
1da70 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  he results in re
1da80 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e  gister "target".
1da90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
1daa0 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65  egister where re
1dab0 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
1dac0 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69  ..**.** With thi
1dad0 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65  s routine, there
1dae0 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65   is no guarantee
1daf0 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69   that results wi
1db00 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20  ll.** be stored 
1db10 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  in target.  The 
1db20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20  result might be 
1db30 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f  stored in some o
1db40 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72  ther.** register
1db50 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e   if it is conven
1db60 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20  ient to do so.  
1db70 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
1db80 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65  tion.** must che
1db90 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  ck the return co
1dba0 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  de and move the 
1dbb0 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64  results to the d
1dbc0 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74  esired.** regist
1dbd0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1dbe0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1dbf0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1dc00 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1dc10 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
1dc20 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1dc30 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20  dbe;  /* The VM 
1dc40 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1dc50 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  on */.  int op; 
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
1dc80 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
1dc90 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72   int inReg = tar
1dca0 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  get;       /* Re
1dcb0 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20  sults stored in 
1dcc0 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a  register inReg *
1dcd0 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
1dce0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1dcf0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
1dd00 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
1dd10 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
1dd20 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
1dd30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
1dd40 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
1dd50 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
1dd60 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31  ster */.  int r1
1dd70 2c 20 72 32 3b 20 20 20 20 20 20 20 20 20 20 20  , r2;           
1dd80 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72      /* Various r
1dd90 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
1dda0 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b  */.  Expr tempX;
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ddc0 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72  * Temporary expr
1ddd0 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20  ession node */. 
1dde0 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20   int p5 = 0;..  
1ddf0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1de00 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
1de10 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
1de20 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ( v==0 ){.    as
1de30 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1de40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1de50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1de60 20 20 7d 0a 0a 65 78 70 72 5f 63 6f 64 65 5f 64    }..expr_code_d
1de70 6f 6f 76 65 72 3a 0a 20 20 69 66 28 20 70 45 78  oover:.  if( pEx
1de80 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
1de90 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
1dea0 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
1deb0 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
1dec0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
1ded0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
1dee0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  MN: {.      AggI
1def0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
1df00 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
1df10 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67  .      struct Ag
1df20 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
1df30 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
1df40 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a  l[pExpr->iAgg];.
1df50 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49        if( !pAggI
1df60 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
1df70 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1df80 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20  t( pCol->iMem>0 
1df90 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1dfa0 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20  n pCol->iMem;.  
1dfb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
1dfc0 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
1dfd0 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
1dfe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dff0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1e000 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
1e010 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20  ngIdxPTab,.     
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e030 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1e040 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
1e050 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72  rget);.        r
1e060 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e070 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f      }.      /* O
1e080 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
1e090 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
1e0a0 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20  COLUMN case */. 
1e0b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e0c0 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
1e0d0 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70   int iTab = pExp
1e0e0 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
1e0f0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1e100 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
1e110 69 78 65 64 43 6f 6c 29 20 29 7b 0a 20 20 20 20  ixedCol) ){.    
1e120 20 20 20 20 2f 2a 20 54 68 69 73 20 43 4f 4c 55      /* This COLU
1e130 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  MN expression is
1e140 20 72 65 61 6c 6c 79 20 61 20 63 6f 6e 73 74 61   really a consta
1e150 6e 74 20 64 75 65 20 74 6f 20 57 48 45 52 45 20  nt due to WHERE 
1e160 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
1e170 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61  * constraints, a
1e180 6e 64 20 74 68 61 74 20 63 6f 6e 73 74 61 6e 74  nd that constant
1e190 20 69 73 20 63 6f 64 65 64 20 62 79 20 74 68 65   is coded by the
1e1a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 0a 20 20   pExpr->pLeft.  
1e1b0 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
1e1c0 73 69 6f 6e 2e 20 20 48 6f 77 65 76 65 72 2c 20  sion.  However, 
1e1d0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  make sure the co
1e1e0 6e 73 74 61 6e 74 20 68 61 73 20 74 68 65 20 63  nstant has the c
1e1f0 6f 72 72 65 63 74 0a 20 20 20 20 20 20 20 20 2a  orrect.        *
1e200 2a 20 64 61 74 61 74 79 70 65 20 62 79 20 61 70  * datatype by ap
1e210 70 6c 79 69 6e 67 20 74 68 65 20 41 66 66 69 6e  plying the Affin
1e220 69 74 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ity of the table
1e230 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 0a 20   column to the. 
1e240 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 61         ** consta
1e250 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nt..        */. 
1e260 20 20 20 20 20 20 20 69 6e 74 20 69 52 65 67 20         int iReg 
1e270 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e280 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1e290 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 74 61 72  pExpr->pLeft,tar
1e2a0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  get);.        in
1e2b0 74 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54  t aff = sqlite3T
1e2c0 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
1e2d0 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54 61 62  ty(pExpr->y.pTab
1e2e0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1e2f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
1e300 66 66 3e 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  ff>SQLITE_AFF_BL
1e310 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OB ){.          
1e320 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1e330 72 20 7a 41 66 66 5b 5d 20 3d 20 22 42 5c 30 30  r zAff[] = "B\00
1e340 30 43 5c 30 30 30 44 5c 30 30 30 45 22 3b 0a 20  0C\000D\000E";. 
1e350 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1e360 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
1e370 3d 3d 27 41 27 20 29 3b 0a 20 20 20 20 20 20 20  =='A' );.       
1e380 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
1e390 45 5f 41 46 46 5f 54 45 58 54 3d 3d 27 42 27 20  E_AFF_TEXT=='B' 
1e3a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1e3b0 20 69 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b   iReg!=target ){
1e3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1e3d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e3e0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 52 65 67  , OP_SCopy, iReg
1e3f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e400 20 20 20 20 20 20 20 69 52 65 67 20 3d 20 74 61         iReg = ta
1e410 72 67 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  rget;.          
1e420 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
1e430 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1e440 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 69 52   OP_Affinity, iR
1e450 65 67 2c 20 31 2c 20 30 2c 0a 20 20 20 20 20 20  eg, 1, 0,.      
1e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e470 20 20 20 20 20 20 26 7a 41 66 66 5b 28 61 66 66        &zAff[(aff
1e480 2d 27 42 27 29 2a 32 5d 2c 20 50 34 5f 53 54 41  -'B')*2], P4_STA
1e490 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TIC);.        }.
1e4a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
1e4b0 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Reg;.      }.   
1e4c0 20 20 20 69 66 28 20 69 54 61 62 3c 30 20 29 7b     if( iTab<0 ){
1e4d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1e4e0 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c 30 20  rse->iSelfTab<0 
1e4f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1e500 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43 4b  Generating CHECK
1e510 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20   constraints or 
1e520 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 70  inserting into p
1e530 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a  artial index */.
1e540 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1e550 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
1e560 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54  - pParse->iSelfT
1e570 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ab;.        }els
1e580 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1e590 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72 65 73  Coding an expres
1e5a0 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61 72  sion that is par
1e5b0 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 77 68  t of an index wh
1e5c0 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ere column names
1e5d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
1e5e0 20 74 68 65 20 69 6e 64 65 78 20 72 65 66 65 72   the index refer
1e5f0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74 6f   to the table to
1e600 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78   which the index
1e610 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20   belongs */.    
1e620 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50 61        iTab = pPa
1e630 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 2d 20  rse->iSelfTab - 
1e640 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1e650 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1e660 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  n sqlite3ExprCod
1e670 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
1e680 65 2c 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62  e, pExpr->y.pTab
1e690 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1e6c0 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20   iTab, target,. 
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1e6f0 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d  xpr->op2);.    }
1e700 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
1e710 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
1e720 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1e730 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
1e740 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1e750 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1e760 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 45      case TK_TRUE
1e770 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20 20 73  FALSE: {.      s
1e780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e790 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1e7a0 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
1e7b0 56 61 6c 75 65 28 70 45 78 70 72 29 2c 20 74 61  Value(pExpr), ta
1e7c0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1e7d0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1e7e0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1e7f0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1e800 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
1e810 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1e820 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1e830 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e840 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1e850 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1e860 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1e870 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
1e880 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1e890 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  et;.    }.#endif
1e8a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
1e8b0 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ING: {.      ass
1e8c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e8d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e8e0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1e8f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1e900 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67  adString(v, targ
1e910 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  et, pExpr->u.zTo
1e920 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ken);.      retu
1e930 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1e940 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1e950 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
1e960 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e970 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
1e980 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1e990 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1e9a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e9b0 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
1e9c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
1e9d0 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
1e9e0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
1e9f0 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61  ar *z;.      cha
1ea00 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20  r *zBlob;.      
1ea10 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ea20 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ea30 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1ea40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1ea50 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
1ea60 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e  =='x' || pExpr->
1ea70 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27  u.zToken[0]=='X'
1ea80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ea90 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1eaa0 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  n[1]=='\'' );.  
1eab0 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e      z = &pExpr->
1eac0 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20  u.zToken[2];.   
1ead0 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
1eae0 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20  rlen30(z) - 1;. 
1eaf0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e       assert( z[n
1eb00 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
1eb10 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   zBlob = sqlite3
1eb20 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65  HexToBlob(sqlite
1eb30 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e  3VdbeDb(v), z, n
1eb40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1eb50 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1eb60 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67  _Blob, n/2, targ
1eb70 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34  et, 0, zBlob, P4
1eb80 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
1eb90 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1eba0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1ebb0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
1ebc0 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
1ebd0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1ebe0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1ebf0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1ec00 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ec10 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
1ec20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1ec30 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
1ec40 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1ec50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ec60 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
1ec70 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
1ec80 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1ec90 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1eca0 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
1ecb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1ecc0 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75  = sqlite3VListNu
1ecd0 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e  mToName(pParse->
1ece0 70 56 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 69  pVList, pExpr->i
1ecf0 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
1ed00 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ed10 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27  u.zToken[0]=='?'
1ed20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72   || strcmp(pExpr
1ed30 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d  ->u.zToken, z)==
1ed40 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
1ed50 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d  rse->pVList[0] =
1ed60 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65 20   0; /* Indicate 
1ed70 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e  VList may no lon
1ed80 67 65 72 20 62 65 20 65 6e 6c 61 72 67 65 64 20  ger be enlarged 
1ed90 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
1eda0 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
1edb0 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53  , (char*)z, P4_S
1edc0 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
1edd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1ede0 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
1edf0 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
1ee00 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1ee10 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
1ee20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1ee30 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
1ee40 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
1ee50 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
1ee60 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
1ee70 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
1ee80 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
1ee90 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1eea0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1eeb0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
1eec0 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
1eed0 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
1eee0 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
1eef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ef00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1ef10 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
1ef20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1ef30 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
1ef40 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1ef50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ef60 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20  _Cast, target,. 
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66         sqlite3Af
1ef90 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
1efa0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b  ->u.zToken, 0));
1efb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e  .      return in
1efc0 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  Reg;.    }.#endi
1efd0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1efe0 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
1eff0 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
1f000 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
1f010 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
1f020 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
1f030 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53  NE;.      p5 = S
1f040 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
1f050 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f      /* fall-thro
1f060 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
1f070 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1f080 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1f090 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1f0a0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1f0b0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1f0c0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45  TK_EQ: {.      E
1f0d0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1f0e0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1f0f0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1f100 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20  IsVector(pLeft) 
1f110 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56  ){.        codeV
1f120 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61  ectorCompare(pPa
1f130 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1f140 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20  et, op, p5);.   
1f150 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f160 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1f170 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f180 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72  e, pLeft, &regFr
1f190 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
1f1a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f1b0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f1c0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1f1d0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1f1e0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1f1f0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78  arse, pLeft, pEx
1f200 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1f210 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1f220 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
1f230 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b  E_STOREP2 | p5);
1f240 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f250 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
1f260 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1f270 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1f280 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
1f290 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f2a0 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
1f2b0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1f2c0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1f2d0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
1f2e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f2f0 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
1f300 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1f310 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1f320 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
1f330 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f340 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
1f350 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1f360 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1f370 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
1f380 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f390 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
1f3a0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
1f3b0 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
1f3c0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
1f3d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f3e0 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
1f3f0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
1f400 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1f410 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
1f420 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1f430 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f440 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1f450 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1f460 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f470 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f480 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
1f490 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
1f4a0 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
1f4b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
1f4c0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
1f4d0 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
1f4e0 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
1f4f0 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
1f500 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
1f510 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
1f520 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
1f530 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
1f540 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
1f550 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
1f560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f570 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20  _AND==OP_And ); 
1f580 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1f590 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ase( op==TK_AND 
1f5a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f5b0 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1f5d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f  stcase( op==TK_O
1f5e0 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
1f5f0 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
1f600 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  dd );           
1f610 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f620 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61  _PLUS );.      a
1f630 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
1f640 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20  =OP_Subtract ); 
1f650 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f660 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
1f670 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
1f680 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
1f690 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1f6a0 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
1f6b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f6c0 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
1f6d0 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74  And );      test
1f6e0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1f6f0 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
1f700 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
1f710 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20  P_BitOr );      
1f720 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f730 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20  TK_BITOR );.    
1f740 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
1f750 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
1f760 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f770 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b   op==TK_SLASH );
1f780 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f790 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
1f7a0 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74  ftLeft );   test
1f7b0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48  case( op==TK_LSH
1f7c0 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
1f7d0 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
1f7e0 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
1f7f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f800 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
1f810 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
1f820 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
1f830 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1f840 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
1f850 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1f860 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f870 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f880 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1f890 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1f8a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f8b0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f8c0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1f8d0 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
1f8e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1f8f0 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
1f900 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
1f910 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f920 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1f930 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1f940 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1f950 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f960 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
1f970 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
1f980 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1f990 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
1f9a0 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
1f9b0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
1f9c0 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
1f9d0 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
1f9e0 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74  rse, pLeft, 1, t
1f9f0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1fa00 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23  return target;.#
1fa10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fa20 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1fa30 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  T.      }else if
1fa40 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
1fa50 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
1fa60 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1fa70 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1fa80 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1fa90 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
1faa0 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54  l(v, pLeft->u.zT
1fab0 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29  oken, 1, target)
1fac0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1fad0 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a   target;.#endif.
1fae0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1faf0 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20       tempX.op = 
1fb00 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TK_INTEGER;.    
1fb10 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20      tempX.flags 
1fb20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  = EP_IntValue|EP
1fb30 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20  _TokenOnly;.    
1fb40 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c      tempX.u.iVal
1fb50 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ue = 0;.        
1fb60 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1fb70 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1fb80 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65   &tempX, &regFre
1fb90 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  e1);.        r2 
1fba0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fbb0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1fbc0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1fbd0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
1fbe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fbf0 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74  3(v, OP_Subtract
1fc00 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
1fc10 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1fc20 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1fc30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1fc40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1fc50 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
1fc60 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
1fc70 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
1fc80 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
1fc90 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65  P_BitNot );   te
1fca0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1fcb0 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61  ITNOT );.      a
1fcc0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f  ssert( TK_NOT==O
1fcd0 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20  P_Not );        
1fce0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fcf0 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  K_NOT );.      r
1fd00 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1fd10 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1fd20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1fd30 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1fd40 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1fd50 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  e1==0 );.      s
1fd60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1fd70 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65  (v, op, r1, inRe
1fd80 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
1fd90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1fda0 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20  TK_TRUTH: {.    
1fdb0 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20    int isTrue;   
1fdc0 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49   /* IS TRUE or I
1fdd0 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20  S NOT TRUE */.  
1fde0 20 20 20 20 69 6e 74 20 62 4e 6f 72 6d 61 6c 3b      int bNormal;
1fdf0 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72     /* IS TRUE or
1fe00 20 49 53 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20   IS FALSE */.   
1fe10 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1fe20 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1fe30 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1fe40 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1fe50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1fe60 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1fe70 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69     isTrue = sqli
1fe80 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75  te3ExprTruthValu
1fe90 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  e(pExpr->pRight)
1fea0 3b 0a 20 20 20 20 20 20 62 4e 6f 72 6d 61 6c 20  ;.      bNormal 
1feb0 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b  = pExpr->op2==TK
1fec0 5f 49 53 3b 0a 20 20 20 20 20 20 74 65 73 74 63  _IS;.      testc
1fed0 61 73 65 28 20 69 73 54 72 75 65 20 26 26 20 62  ase( isTrue && b
1fee0 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 74  Normal);.      t
1fef0 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75 65  estcase( !isTrue
1ff00 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20   && bNormal);.  
1ff10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ff20 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
1ff30 73 54 72 75 65 2c 20 72 31 2c 20 69 6e 52 65 67  sTrue, r1, inReg
1ff40 2c 20 21 69 73 54 72 75 65 2c 20 69 73 54 72 75  , !isTrue, isTru
1ff50 65 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20  e ^ bNormal);.  
1ff60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ff70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1ff80 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1ff90 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1ffa0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
1ffb0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
1ffc0 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
1ffd0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1ffe0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
1fff0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
20000 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
20010 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
20020 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
20030 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20040 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20050 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
20060 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  get);.      r1 =
20070 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20080 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
20090 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
200a0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
200b0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
200c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
200d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
200e0 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b  dOp1(v, op, r1);
200f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
20100 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
20110 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
20120 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
20130 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
20140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20150 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20160 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67  Integer, 0, targ
20170 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
20180 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
20190 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62  , addr);.      b
201a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
201b0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
201c0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
201d0 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
201e0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
201f0 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
20200 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
20210 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
20220 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
20230 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
20240 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
20250 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
20260 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
20270 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72  te: %s()", pExpr
20280 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
20290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
202a0 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 2d 3e    return pInfo->
202b0 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67  aFunc[pExpr->iAg
202c0 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  g].iMem;.      }
202d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
202e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
202f0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
20300 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72    ExprList *pFar
20310 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  g;       /* List
20320 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
20330 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
20340 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20  int nFarg;      
20350 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20360 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
20370 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
20380 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20  FuncDef *pDef;  
20390 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
203a0 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
203b0 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  n object */.    
203c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
203d0 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
203e0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
203f0 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74  .      u32 const
20400 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Mask = 0;     /*
20410 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f   Mask of functio
20420 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74  n arguments that
20430 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f   are constant */
20440 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20460 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
20470 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
20480 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20490 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
204a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
204b0 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
204c0 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20  NC(db);      /* 
204d0 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  The text encodin
204e0 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20 64  g used by this d
204f0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
20500 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
20510 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c  = 0;    /* A col
20520 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
20530 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
20540 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
20550 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  NC.      if( Exp
20560 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20570 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20  pr, EP_WinFunc) 
20580 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
20590 6e 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d  n pExpr->y.pWin-
205a0 3e 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20 20  >regResult;.    
205b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
205c0 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f    if( ConstFacto
205d0 72 4f 6b 28 70 50 61 72 73 65 29 20 26 26 20 73  rOk(pParse) && s
205e0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
205f0 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
20600 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
20610 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63   SQL functions c
20620 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e  an be expensive.
20630 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20   So try to move 
20640 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f  constant functio
20650 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  ns.        ** ou
20660 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  t of the inner l
20670 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61  oop, even if tha
20680 74 20 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61  t means an extra
20690 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20   OP_Copy. */.   
206a0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
206b0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
206c0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
206d0 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -1);.      }.  
206e0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
206f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20700 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
20710 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  ) );.      if( E
20720 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20730 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
20740 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ly) ){.        p
20750 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Farg = 0;.      
20760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
20770 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Farg = pExpr->x.
20780 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
20790 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61       nFarg = pFa
207a0 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70  rg ? pFarg->nExp
207b0 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73  r : 0;.      ass
207c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
207d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
207e0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
207f0 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
20800 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
20810 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
20820 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
20830 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  Id, nFarg, enc, 
20840 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0);.#ifdef SQLIT
20850 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e  E_ENABLE_UNKNOWN
20860 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20  _SQL_FUNCTION.  
20870 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
20880 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  && pParse->expla
20890 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  in ){.        pD
208a0 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
208b0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e  Function(db, "un
208c0 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65  known", nFarg, e
208d0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nc, 0);.      }.
208e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
208f0 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66   pDef==0 || pDef
20900 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29  ->xFinalize!=0 )
20910 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20920 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20930 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74  , "unknown funct
20940 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29  ion: %s()", zId)
20950 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
20960 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
20970 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72  /* Attempt a dir
20980 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ect implementati
20990 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d  on of the built-
209a0 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e  in COALESCE() an
209b0 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c  d.      ** IFNUL
209c0 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  L() functions.  
209d0 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65  This avoids unne
209e0 63 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69  cessary evaluati
209f0 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  on of.      ** a
20a00 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68  rguments past th
20a10 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c  e first non-NULL
20a20 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
20a30 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
20a40 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20a50 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c  SQLITE_FUNC_COAL
20a60 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ESCE ){.        
20a70 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20  int endCoalesce 
20a80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
20a90 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
20aa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20ab0 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20  nFarg>=2 );.    
20ac0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20ad0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
20ae0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74  g->a[0].pExpr, t
20af0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
20b00 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67  for(i=1; i<nFarg
20b10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
20b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20b30 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op2(v, OP_NotNul
20b40 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f  l, target, endCo
20b50 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20  alesce);.       
20b60 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
20b70 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
20b80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
20b90 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
20ba0 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
20bb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20bc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
20bd0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
20be0 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
20bf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20c00 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68    }..      /* Th
20c10 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e  e UNLIKELY() fun
20c20 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
20c30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
20c40 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
20c50 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
20c60 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
20c70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
20c80 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20c90 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49  SQLITE_FUNC_UNLI
20ca0 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  KELY ){.        
20cb0 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31  assert( nFarg>=1
20cc0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
20cd0 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
20ce0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
20cf0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
20d00 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
20d10 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
20d20 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
20d30 2f 2a 20 54 68 65 20 41 46 46 49 4e 49 54 59 28  /* The AFFINITY(
20d40 29 20 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75  ) function evalu
20d50 61 74 65 73 20 74 6f 20 61 20 73 74 72 69 6e 67  ates to a string
20d60 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
20d70 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 79 70        ** the typ
20d80 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
20d90 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69  e argument.  Thi
20da0 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
20db0 73 74 69 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a  sting of.      *
20dc0 2a 20 74 68 65 20 53 51 4c 69 74 65 20 74 79 70  * the SQLite typ
20dd0 65 20 6c 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a  e logic..      *
20de0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
20df0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
20e00 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49  LITE_FUNC_AFFINI
20e10 54 59 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  TY ){.        co
20e20 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 66 66 5b  nst char *azAff[
20e30 5d 20 3d 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74  ] = { "blob", "t
20e40 65 78 74 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c  ext", "numeric",
20e50 20 22 69 6e 74 65 67 65 72 22 2c 20 22 72 65 61   "integer", "rea
20e60 6c 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 63 68  l" };.        ch
20e70 61 72 20 61 66 66 3b 0a 20 20 20 20 20 20 20 20  ar aff;.        
20e80 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31  assert( nFarg==1
20e90 20 29 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20   );.        aff 
20ea0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
20eb0 69 6e 69 74 79 28 70 46 61 72 67 2d 3e 61 5b 30  inity(pFarg->a[0
20ec0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
20ed0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
20ee0 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65  dString(v, targe
20ef0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
20f00 20 20 20 20 28 61 66 66 3c 3d 53 51 4c 49 54 45      (aff<=SQLITE
20f10 5f 41 46 46 5f 4e 4f 4e 45 29 20 3f 20 22 6e 6f  _AFF_NONE) ? "no
20f20 6e 65 22 20 3a 20 61 7a 41 66 66 5b 61 66 66 2d  ne" : azAff[aff-
20f30 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d  SQLITE_AFF_BLOB]
20f40 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
20f50 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  n target;.      
20f60 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
20f70 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67  for(i=0; i<nFarg
20f80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
20f90 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69  if( i<32 && sqli
20fa0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
20fb0 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  t(pFarg->a[i].pE
20fc0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
20fd0 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33    testcase( i==3
20fe0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
20ff0 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  onstMask |= MASK
21000 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20  BIT32(i);.      
21010 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
21020 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
21030 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
21040 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21  EEDCOLL)!=0 && !
21050 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
21060 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
21070 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
21080 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
21090 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
210a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
210b0 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20    if( pFarg ){. 
210c0 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74         if( const
210d0 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  Mask ){.        
210e0 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e    r1 = pParse->n
210f0 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  Mem+1;.         
21100 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
21110 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20   nFarg;.        
21120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21130 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
21140 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
21150 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
21160 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
21170 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64  For length() and
21180 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69   typeof() functi
21190 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d  ons with a colum
211a0 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20  n argument,.    
211b0 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50      ** set the P
211c0 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  5 parameter to t
211d0 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63  he OP_Column opc
211e0 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45  ode to OPFLAG_LE
211f0 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20 20 20  NGTHARG.        
21200 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50  ** or OPFLAG_TYP
21210 45 4f 46 41 52 47 20 72 65 73 70 65 63 74 69 76  EOFARG respectiv
21220 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e  ely, to avoid un
21230 6e 65 63 65 73 73 61 72 79 20 64 61 74 61 0a 20  necessary data. 
21240 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e         ** loadin
21250 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  g..        */.  
21260 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
21270 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51  >funcFlags & (SQ
21280 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
21290 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50  |SQLITE_FUNC_TYP
212a0 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  EOF))!=0 ){.    
212b0 20 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b        u8 exprOp;
212c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
212d0 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20  t( nFarg==1 );. 
212e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
212f0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21300 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
21310 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72     exprOp = pFar
21320 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  g->a[0].pExpr->o
21330 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  p;.          if(
21340 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55   exprOp==TK_COLU
21350 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b  MN || exprOp==TK
21360 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  _AGG_COLUMN ){. 
21370 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
21380 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  t( SQLITE_FUNC_L
21390 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45  ENGTH==OPFLAG_LE
213a0 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
213b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
213c0 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f  QLITE_FUNC_TYPEO
213d0 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  F==OPFLAG_TYPEOF
213e0 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
213f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
21400 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f  f->funcFlags & O
21410 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
21420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
21430 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
21440 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20  ->op2 = .       
21450 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d             pDef-
21460 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50  >funcFlags & (OP
21470 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f  FLAG_LENGTHARG|O
21480 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29  PFLAG_TYPEOFARG)
21490 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
214a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
214b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
214c0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
214d0 20 70 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20   pFarg, r1, 0,. 
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
21500 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53  QLITE_ECEL_DUP|S
21510 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
21520 52 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  R);.      }else{
21530 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b  .        r1 = 0;
21540 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
21550 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
21560 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
21570 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72  /* Possibly over
21580 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f  load the functio
21590 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61  n if the first a
215a0 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20  rgument is.     
215b0 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61   ** a virtual ta
215c0 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  ble column..    
215d0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
215e0 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  r infix function
215f0 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52  s (LIKE, GLOB, R
21600 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48  EGEXP, and MATCH
21610 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  ) use the.      
21620 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
21630 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73  nt, not the firs
21640 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  t, as the argume
21650 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20  nt to test to.  
21660 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
21670 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
21680 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
21690 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62    This is done b
216a0 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
216b0 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
216c0 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69   of infix functi
216d0 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64  ons (the operand
216e0 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20   we want to.    
216f0 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65    ** control ove
21700 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75  rloading) ends u
21710 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  p as the second 
21720 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
21730 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
21740 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  n.  The expressi
21750 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73  on "A glob B" is
21760 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
21770 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42        ** "glob(B
21780 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f  ,A).  We want to
21790 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41   use the A in "A
217a0 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74   glob B" to test
217b0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75  .      ** for fu
217c0 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
217d0 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20  ng.  But we use 
217e0 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67  the B term in "g
217f0 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20  lob(B,A)"..     
21800 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46   */.      if( nF
21810 61 72 67 3e 3d 32 20 26 26 20 45 78 70 72 48 61  arg>=2 && ExprHa
21820 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
21830 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29   EP_InfixFunc) )
21840 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
21850 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
21860 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
21870 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
21880 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  arg->a[1].pExpr)
21890 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
218a0 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20  ( nFarg>0 ){.   
218b0 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
218c0 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
218d0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
218e0 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
218f0 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
21900 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
21910 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
21920 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
21930 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
21940 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
21950 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
21960 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
21970 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21980 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
21990 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
219a0 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
219b0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
219c0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
219d0 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53  _ENABLE_OFFSET_S
219e0 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20 69 66  QL_FUNC.      if
219f0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
21a00 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
21a10 4f 46 46 53 45 54 20 29 7b 0a 20 20 20 20 20 20  OFFSET ){.      
21a20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d 20 70    Expr *pArg = p
21a30 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
21a40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
21a50 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  rg->op==TK_COLUM
21a60 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  N ){.          s
21a70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
21a80 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c 20 70  (v, OP_Offset, p
21a90 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70 41 72  Arg->iTable, pAr
21aa0 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  g->iColumn, targ
21ab0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  et);.        }el
21ac0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
21ad0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21ae0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
21af0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
21b00 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  }.      }else.#e
21b10 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
21b20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21b30 41 64 64 4f 70 34 28 76 2c 20 70 50 61 72 73 65  AddOp4(v, pParse
21b40 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f  ->iSelfTab ? OP_
21b50 50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46  PureFunc0 : OP_F
21b60 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20  unction0,.      
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b80 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72      constMask, r
21b90 31 2c 20 74 61 72 67 65 74 2c 20 28 63 68 61 72  1, target, (char
21ba0 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44  *)pDef, P4_FUNCD
21bb0 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  EF);.        sql
21bc0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
21bd0 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a  (v, (u8)nFarg);.
21be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
21bf0 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74  ( nFarg && const
21c00 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Mask==0 ){.     
21c10 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
21c20 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
21c30 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20  e, r1, nFarg);. 
21c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
21c50 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
21c60 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
21c70 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
21c80 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
21c90 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
21ca0 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  ELECT: {.      i
21cb0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74  nt nCol;.      t
21cc0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
21cd0 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
21ce0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
21cf0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
21d00 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45   if( op==TK_SELE
21d10 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45  CT && (nCol = pE
21d20 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
21d30 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d  pEList->nExpr)!=
21d40 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
21d50 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
21d60 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c  or(pParse, nCol,
21d70 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
21d80 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
21d90 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
21da0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
21db0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
21dc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
21dd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
21de0 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  ECT_COLUMN: {.  
21df0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
21e00 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
21e10 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  t->iTable==0 ){.
21e20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
21e30 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73  Left->iTable = s
21e40 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
21e50 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
21e60 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
21e70 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
21e80 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
21e90 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66  0 || pExpr->pLef
21ea0 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  t->op==TK_SELECT
21eb0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
21ec0 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 30 0a 20  xpr->iTable!=0. 
21ed0 20 20 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e        && pExpr->
21ee0 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73 71 6c  iTable!=(n = sql
21ef0 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
21f00 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ze(pExpr->pLeft)
21f10 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
21f20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
21f30 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63  sg(pParse, "%d c
21f40 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20  olumns assigned 
21f50 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20  %d values",.    
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f70 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
21f80 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20  r->iTable, n);. 
21f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
21fa0 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  urn pExpr->pLeft
21fb0 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72  ->iTable + pExpr
21fc0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d  ->iColumn;.    }
21fd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
21fe0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
21ff0 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
22000 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
22010 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
22020 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
22030 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
22040 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
22050 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22060 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
22070 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
22080 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
22090 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
220a0 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
220b0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
220c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
220d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
220e0 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
220f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22100 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
22110 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
22120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22130 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
22140 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30  ddImm, target, 0
22150 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22160 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
22170 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
22180 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
22190 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
221a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
221b0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
221c0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
221d0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
221e0 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
221f0 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
22200 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
22210 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
22220 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
22230 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
22240 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
22250 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
22260 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
22270 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
22280 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
22290 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
222a0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
222b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
222c0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
222d0 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
222e0 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
222f0 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30  pr, target, 0, 0
22300 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22310 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
22320 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a    case TK_SPAN:.
22330 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
22340 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
22350 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
22360 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e   pExpr = pExpr->
22370 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 67 6f 74  pLeft;.      got
22380 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76  o expr_code_doov
22390 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30 34 2d 32  er; /* 2018-04-2
223a0 38 3a 20 50 72 65 76 65 6e 74 20 64 65 65 70 20  8: Prevent deep 
223b0 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53 53 46 75  recursion. OSSFu
223c0 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  zz. */.    }..  
223d0 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
223e0 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
223f0 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
22400 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
22410 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
22420 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
22430 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
22440 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
22450 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
22460 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
22470 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
22480 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
22490 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
224a0 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
224b0 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
224c0 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
224d0 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
224e0 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
224f0 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
22500 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
22510 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
22520 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
22530 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
22540 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
22550 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
22560 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
22570 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
22580 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
22590 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
225a0 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f  ng an OP_Param o
225b0 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20  pcode. The p1.  
225c0 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
225d0 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72   is set to 0 for
225e0 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65   an old.rowid re
225f0 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28  ference, or to (
22600 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  i+1).      ** to
22610 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68   reference anoth
22620 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  er column of the
22630 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
22640 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ble, where .    
22650 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
22660 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
22670 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77  n. For a new.row
22680 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31  id reference, p1
22690 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74   is.      ** set
226a0 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65   to (n+1), where
226b0 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   n is the number
226c0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65   of columns in e
226d0 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  ach pseudo-table
226e0 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  ..      ** For a
226f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
22700 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69  y other column i
22710 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75  n the new.* pseu
22720 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20  do-table, p1.   
22730 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
22740 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e  (n+2+i), where n
22750 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65   and i are as de
22760 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79  fined previously
22770 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65  . For.      ** e
22780 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
22790 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72  able on which tr
227a0 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67  iggers are being
227b0 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20   fired is.      
227c0 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a  ** declared as:.
227d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
227e0 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
227f0 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
22800 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
22810 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65  n p1 is interpre
22820 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
22830 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
22840 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20  *   p1==0   ->  
22850 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20    old.rowid     
22860 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65  p1==3   ->    ne
22870 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  w.rowid.      **
22880 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20     p1==1   ->   
22890 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70   old.a         p
228a0 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==4   ->    new
228b0 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  .a.      **   p1
228c0 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==2   ->    old.
228d0 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20  b         p1==5 
228e0 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20    ->    new.b   
228f0 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20      .      */.  
22900 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
22910 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b  = pExpr->y.pTab;
22920 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20  .      int p1 = 
22930 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20  pExpr->iTable * 
22940 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b  (pTab->nCol+1) +
22950 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c   1 + pExpr->iCol
22960 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  umn;..      asse
22970 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt( pExpr->iTabl
22980 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  e==0 || pExpr->i
22990 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
229a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
229b0 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20  >iColumn>=-1 && 
229c0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
229d0 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
229e0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
229f0 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70  >iPKey<0 || pExp
22a00 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62  r->iColumn!=pTab
22a10 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20  ->iPKey );.     
22a20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26   assert( p1>=0 &
22a30 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c  & p1<(pTab->nCol
22a40 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20  *2+2) );..      
22a50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22a60 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70  2(v, OP_Param, p
22a70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
22a80 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
22a90 2c 20 22 72 5b 25 64 5d 3d 25 73 2e 25 73 22 2c  , "r[%d]=%s.%s",
22aa0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
22ab0 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20   (pExpr->iTable 
22ac0 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29  ? "new" : "old")
22ad0 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
22ae0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72  ->iColumn<0 ? "r
22af0 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 79  owid" : pExpr->y
22b00 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70  .pTab->aCol[pExp
22b10 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d  r->iColumn].zNam
22b20 65 29 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69  e).      ));..#i
22b30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22b40 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
22b50 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
22b60 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c   column has REAL
22b70 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61   affinity, it ma
22b80 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73  y currently be s
22b90 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20  tored as an.    
22ba0 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73    ** integer. Us
22bb0 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  e OP_RealAffinit
22bc0 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69  y to make sure i
22bd0 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c  t is really real
22be0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
22bf0 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
22c00 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20 53   R-60985-57662 S
22c10 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65  QLite will conve
22c20 72 74 20 74 68 65 20 76 61 6c 75 65 20 62 61 63  rt the value bac
22c30 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c  k to.      ** fl
22c40 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68 65  oating point whe
22c50 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 74 20  n extracting it 
22c60 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e  from the record.
22c70 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
22c80 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
22c90 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62   .       && pTab
22ca0 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
22cb0 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d  olumn].affinity=
22cc0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
22cd0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
22ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22cf0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66  Op1(v, OP_RealAf
22d00 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b  finity, target);
22d10 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
22d20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22d30 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
22d40 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20  VECTOR: {.      
22d50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
22d60 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c  pParse, "row val
22d70 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20  ue misused");.  
22d80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22d90 0a 0a 20 20 20 20 2f 2a 20 54 4b 5f 49 46 5f 4e  ..    /* TK_IF_N
22da0 55 4c 4c 5f 52 4f 57 20 45 78 70 72 20 6e 6f 64  ULL_ROW Expr nod
22db0 65 73 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  es are inserted 
22dc0 61 68 65 61 64 20 6f 66 20 65 78 70 72 65 73 73  ahead of express
22dd0 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  ions.    ** that
22de0 20 64 65 72 69 76 65 20 66 72 6f 6d 20 74 68 65   derive from the
22df0 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61 62 6c   right-hand tabl
22e00 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
22e10 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 45 78  .  The.    ** Ex
22e20 70 72 2e 69 54 61 62 6c 65 20 76 61 6c 75 65 20  pr.iTable value 
22e30 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d  is the table num
22e40 62 65 72 20 66 6f 72 20 74 68 65 20 72 69 67 68  ber for the righ
22e50 74 2d 68 61 6e 64 20 74 61 62 6c 65 2e 0a 20 20  t-hand table..  
22e60 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73    ** The express
22e70 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 61 6c  ion is only eval
22e80 75 61 74 65 64 20 69 66 20 74 68 61 74 20 74 61  uated if that ta
22e90 62 6c 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  ble is not curre
22ea0 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6f 6e 20 61  ntly.    ** on a
22eb0 20 4c 45 46 54 20 4a 4f 49 4e 20 4e 55 4c 4c 20   LEFT JOIN NULL 
22ec0 72 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  row..    */.    
22ed0 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  case TK_IF_NULL_
22ee0 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ROW: {.      int
22ef0 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20 20 20   addrINR;.      
22f00 75 38 20 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  u8 okConstFactor
22f10 20 3d 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e   = pParse->okCon
22f20 73 74 46 61 63 74 6f 72 3b 0a 20 20 20 20 20 20  stFactor;.      
22f30 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69 74 65  addrINR = sqlite
22f40 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
22f50 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70 45 78  P_IfNullRow, pEx
22f60 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
22f70 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c     /* Temporaril
22f80 79 20 64 69 73 61 62 6c 65 20 66 61 63 74 6f 72  y disable factor
22f90 69 6e 67 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20  ing of constant 
22fa0 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 69 6e  expressions, sin
22fb0 63 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  ce.      ** even
22fc0 20 74 68 6f 75 67 68 20 65 78 70 72 65 73 73 69   though expressi
22fd0 6f 6e 73 20 6d 61 79 20 61 70 70 65 61 72 20 74  ons may appear t
22fe0 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 2c 20 74  o be constant, t
22ff0 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20  hey are not.    
23000 20 20 2a 2a 20 72 65 61 6c 6c 79 20 63 6f 6e 73    ** really cons
23010 74 61 6e 74 20 62 65 63 61 75 73 65 20 74 68 65  tant because the
23020 79 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  y originate from
23030 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
23040 73 69 64 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  side.      ** of
23050 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 2a 2f   a LEFT JOIN. */
23060 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f  .      pParse->o
23070 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 30  kConstFactor = 0
23080 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
23090 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
230a0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
230b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
230c0 65 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  et);.      pPars
230d0 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
230e0 20 3d 20 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72   = okConstFactor
230f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
23100 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
23110 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20 73  ddrINR);.      s
23120 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
23130 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20 69  P3(v, addrINR, i
23140 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
23150 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
23160 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
23170 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
23180 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
23190 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
231a0 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
231b0 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
231c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
231d0 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
231e0 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
231f0 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
23200 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
23210 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
23220 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
23230 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
23240 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
23250 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
23260 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
23270 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
23280 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
23290 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
232a0 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
232b0 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
232c0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
232d0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
232e0 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
232f0 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
23300 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
23310 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74  Y is in the last
23320 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70   element of pExp
23330 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45  r->x.pList if pE
23340 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
23350 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64  xpr is.    ** od
23360 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73  d.  The Y is als
23370 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20  o optional.  If 
23380 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
23390 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73  ements in x.pLis
233a0 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e  t.    ** is even
233b0 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74  , then Y is omit
233c0 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68  ted and the "oth
233d0 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69  erwise" result i
233e0 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
233f0 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
23400 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
23410 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
23420 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
23430 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
23440 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
23450 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
23460 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
23470 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
23480 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
23490 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
234a0 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
234b0 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
234c0 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
234d0 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
234e0 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
234f0 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
23500 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
23510 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
23520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23530 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
23540 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
23550 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
23560 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23580 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
23590 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
235a0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
235b0 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
235c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235d0 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
235e0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
235f0 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
23600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23610 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
23620 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
23630 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
23640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23650 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
23660 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
23670 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
23680 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
23690 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
236a0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
236b0 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
236c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
236d0 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
236e0 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
236f0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23710 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
23720 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
23730 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74       Expr *pTest
23740 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23750 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20         /* X==Ei 
23760 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74  (form A) or just
23770 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a   Ei (form B) */.
23780 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 65 6c        Expr *pDel
23790 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
237a0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
237b0 2d 3e 64 62 3b 0a 0a 20 20 20 20 20 20 61 73 73  ->db;..      ass
237c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
237d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
237e0 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45  xIsSelect) && pE
237f0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a  xpr->x.pList );.
23800 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
23810 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
23820 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
23830 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
23840 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c  .pList;.      aL
23850 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74  istelem = pEList
23860 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  ->a;.      nExpr
23870 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
23880 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c  ;.      endLabel
23890 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
238a0 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
238b0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
238c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
238d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
238e0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  l = sqlite3ExprD
238f0 75 70 28 64 62 2c 20 70 58 2c 20 30 29 3b 0a 20  up(db, pX, 0);. 
23900 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
23910 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
23920 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23930 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
23940 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Del);.          
23950 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
23960 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
23970 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
23980 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
23990 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70  exprToRegister(p
239a0 44 65 6c 2c 20 65 78 70 72 43 6f 64 65 56 65 63  Del, exprCodeVec
239b0 74 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 6c  tor(pParse, pDel
239c0 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
239d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
239e0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
239f0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
23a00 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69  opCompare, 0, si
23a10 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72 65 29 29  zeof(opCompare))
23a20 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
23a30 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a  are.op = TK_EQ;.
23a40 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
23a50 65 2e 70 4c 65 66 74 20 3d 20 70 44 65 6c 3b 0a  e.pLeft = pDel;.
23a60 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
23a70 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20  &opCompare;.    
23a80 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33      /* Ticket b3
23a90 35 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39  51d95f9cd5ef17e9
23aa0 64 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31  d9dbae18f5ca8611
23ab0 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20  190001:.        
23ac0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
23ad0 72 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67  regFree1 might g
23ae0 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f  et SCopy-ed into
23af0 20 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74   the file result
23b00 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20  ..        ** So 
23b10 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
23b20 68 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69  he regFree1 regi
23b30 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73  ster is not reus
23b40 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20  ed for other.   
23b50 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73       ** purposes
23b60 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76   and possibly ov
23b70 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20  erwritten.  */. 
23b80 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20         regFree1 
23b90 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
23ba0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
23bb0 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20  xpr-1; i=i+2){. 
23bc0 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b         if( pX ){
23bd0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
23be0 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20  t( pTest!=0 );. 
23bf0 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61           opCompa
23c00 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73  re.pRight = aLis
23c10 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
23c20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23c30 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d           pTest =
23c40 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
23c50 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
23c60 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20         nextCase 
23c70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
23c80 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
23c90 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
23ca0 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
23cb0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
23cc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
23cd0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
23ce0 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
23cf0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
23d00 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
23d10 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
23d20 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
23d30 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
23d40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
23d50 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
23d60 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
23d70 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
23d80 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
23d90 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  o(v, endLabel);.
23da0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23db0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
23dc0 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20  v, nextCase);.  
23dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23de0 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a  (nExpr&1)!=0 ){.
23df0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
23e00 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
23e10 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d  pEList->a[nExpr-
23e20 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
23e30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
23e40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23e50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23e60 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
23e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23e80 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
23e90 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
23ea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
23eb0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
23ec0 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62  dLabel);.      b
23ed0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
23ee0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23ef0 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65  TRIGGER.    case
23f00 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
23f10 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
23f20 2d 3e 61 66 66 45 78 70 72 3d 3d 4f 45 5f 52 6f  ->affExpr==OE_Ro
23f30 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20  llback .        
23f40 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
23f50 45 78 70 72 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20  Expr==OE_Abort. 
23f60 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
23f70 70 72 2d 3e 61 66 66 45 78 70 72 3d 3d 4f 45 5f  pr->affExpr==OE_
23f80 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  Fail.           
23f90 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 45 78 70  || pExpr->affExp
23fa0 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20  r==OE_Ignore.   
23fb0 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
23fc0 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65  !pParse->pTrigge
23fd0 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  rTab ){.        
23fe0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23ff0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
24010 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
24020 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
24030 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
24040 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  m");.        ret
24050 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
24060 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
24070 61 66 66 45 78 70 72 3d 3d 4f 45 5f 41 62 6f 72  affExpr==OE_Abor
24080 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
24090 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
240a0 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
240b0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
240c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
240d0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
240e0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
240f0 78 70 72 2d 3e 61 66 66 45 78 70 72 3d 3d 4f 45  xpr->affExpr==OE
24100 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
24110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24120 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20  dOp4(.          
24130 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51    v, OP_Halt, SQ
24140 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f  LITE_OK, OE_Igno
24150 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  re, 0, pExpr->u.
24160 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20  zToken,0);.     
24170 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
24180 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
24190 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
241a0 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
241b0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f  Parse, SQLITE_CO
241c0 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
241d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241f0 70 45 78 70 72 2d 3e 61 66 66 45 78 70 72 2c 20  pExpr->affExpr, 
24200 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
24210 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
24220 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
24230 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
24240 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
24250 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
24260 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
24270 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
24280 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
24290 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  e2);.  return in
242a0 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61  Reg;.}../*.** Fa
242b0 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64  ctor out the cod
242c0 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  e of the given e
242d0 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69  xpression to ini
242e0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
242f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65  ..**.** If regDe
24300 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 72  st>=0 then the r
24310 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20  esult is always 
24320 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20 72  stored in that r
24330 65 67 69 73 74 65 72 20 61 6e 64 20 74 68 65 0a  egister and the.
24340 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74  ** result is not
24350 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20 72   reusable.  If r
24360 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74 68  egDest<0 then th
24370 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66 72  is routine is fr
24380 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20  ee to .** store 
24390 74 68 65 20 76 61 6c 75 65 20 77 68 65 72 65 65  the value wheree
243a0 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20 54  ver it wants.  T
243b0 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72  he register wher
243c0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
243d0 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69   .** is stored i
243e0 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68 65  s returned.  Whe
243f0 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77 6f  n regDest<0, two
24400 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72 65   identical expre
24410 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63  ssions will.** c
24420 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ode to the same 
24430 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
24440 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24450 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20  AtInit(.  Parse 
24460 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
24470 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
24480 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
24490 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
244a0 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20  ression to code 
244b0 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e  when the VDBE in
244c0 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69  itializes */.  i
244d0 6e 74 20 72 65 67 44 65 73 74 20 20 20 20 20 20  nt regDest      
244e0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61   /* Store the va
244f0 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
24500 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
24510 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65  rList *p;.  asse
24520 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  rt( ConstFactorO
24530 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70  k(pParse) );.  p
24540 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73   = pParse->pCons
24550 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65 67  tExpr;.  if( reg
24560 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a 20  Dest<0 && p ){. 
24570 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
24580 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
24590 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
245a0 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69  or(pItem=p->a, i
245b0 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20  =p->nExpr; i>0; 
245c0 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20  pItem++, i--){. 
245d0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
245e0 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69  reusable && sqli
245f0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
24600 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45  ,pItem->pExpr,pE
24610 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  xpr,-1)==0 ){.  
24620 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74        return pIt
24630 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72  em->u.iConstExpr
24640 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Reg;.      }.   
24650 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d   }.  }.  pExpr =
24660 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
24670 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
24680 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c  r, 0);.  p = sql
24690 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
246a0 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  nd(pParse, p, pE
246b0 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  xpr);.  if( p ){
246c0 0a 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70  .     struct Exp
246d0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
246e0 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78  m = &p->a[p->nEx
246f0 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65  pr-1];.     pIte
24700 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65  m->reusable = re
24710 67 44 65 73 74 3c 30 3b 0a 20 20 20 20 20 69 66  gDest<0;.     if
24720 28 20 72 65 67 44 65 73 74 3c 30 20 29 20 72 65  ( regDest<0 ) re
24730 67 44 65 73 74 20 3d 20 2b 2b 70 50 61 72 73 65  gDest = ++pParse
24740 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74  ->nMem;.     pIt
24750 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72  em->u.iConstExpr
24760 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20  Reg = regDest;. 
24770 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f   }.  pParse->pCo
24780 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 20 20 72  nstExpr = p;.  r
24790 65 74 75 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d  eturn regDest;.}
247a0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
247b0 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
247c0 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
247d0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
247e0 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20  sults.** into a 
247f0 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72  register.  Retur
24800 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  n the register n
24810 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20  umber where the 
24820 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73  results.** are s
24830 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tored..**.** If 
24840 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20  the register is 
24850 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  a temporary regi
24860 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65  ster that can be
24870 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a   deallocated,.**
24880 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20   then write its 
24890 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65  number into *pRe
248a0 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c  g.  If the resul
248b0 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  t register is no
248c0 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  t.** a temporary
248d0 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67  , then set *pReg
248e0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   to zero..**.** 
248f0 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
24900 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69  nstant, then thi
24910 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
24920 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a  generate this.**
24930 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68   code to fill th
24940 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  e register in th
24950 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
24960 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a   section of the.
24970 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c  ** VDBE program,
24980 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63   in order to fac
24990 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68  tor it out of th
249a0 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f  e evaluation loo
249b0 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
249c0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61  3ExprCodeTemp(Pa
249d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
249e0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70  r *pExpr, int *p
249f0 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a  Reg){.  int r2;.
24a00 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
24a10 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
24a20 41 6e 64 4c 69 6b 65 6c 79 28 70 45 78 70 72 29  AndLikely(pExpr)
24a30 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63  ;.  if( ConstFac
24a40 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20  torOk(pParse).  
24a50 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
24a60 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26 26  K_REGISTER.   &&
24a70 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
24a80 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45  nstantNotJoin(pE
24a90 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70  xpr).  ){.    *p
24aa0 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 72 32  Reg  = 0;.    r2
24ab0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24ac0 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
24ad0 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 7d   pExpr, -1);.  }
24ae0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31  else{.    int r1
24af0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
24b00 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
24b10 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
24b20 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
24b30 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b  rse, pExpr, r1);
24b40 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20  .    if( r2==r1 
24b50 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  ){.      *pReg =
24b60 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   r1;.    }else{.
24b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
24b80 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
24b90 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a  se, r1);.      *
24ba0 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
24bb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b    }.  return r2;
24bc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
24bd0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
24be0 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
24bf0 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
24c00 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
24c10 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
24c20 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
24c30 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
24c40 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
24c50 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
24c60 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rget..*/.void sq
24c70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
24c80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
24c90 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
24ca0 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52  rget){.  int inR
24cb0 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  eg;..  assert( t
24cc0 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
24cd0 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
24ce0 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26  );.  if( pExpr &
24cf0 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  & pExpr->op==TK_
24d00 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
24d10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24d20 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
24d30 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d   OP_Copy, pExpr-
24d40 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29  >iTable, target)
24d50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
24d60 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
24d70 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
24d80 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
24d90 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  et);.    assert(
24da0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
24db0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
24dc0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
24dd0 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d  .    if( inReg!=
24de0 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65  target && pParse
24df0 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20  ->pVdbe ){.     
24e00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24e10 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
24e20 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
24e30 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
24e40 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  }.  }.}../*.** M
24e50 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ake a transient 
24e60 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
24e70 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68 65  on pExpr and the
24e80 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67 0a  n code it using.
24e90 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ** sqlite3ExprCo
24ea0 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  de().  This rout
24eb0 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  ine works just l
24ec0 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  ike sqlite3ExprC
24ed0 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74 20  ode().** except 
24ee0 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20 65  that the input e
24ef0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75 61  xpression is gua
24f00 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e  ranteed to be un
24f10 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64  changed..*/.void
24f20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24f30 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72  Copy(Parse *pPar
24f40 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
24f50 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
24f60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
24f70 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70  arse->db;.  pExp
24f80 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
24f90 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
24fa0 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  ;.  if( !db->mal
24fb0 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c 69  locFailed ) sqli
24fc0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
24fd0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
24fe0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
24ff0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
25000 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  r);.}../*.** Gen
25010 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
25020 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
25030 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
25040 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
25050 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
25060 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
25070 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
25080 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
25090 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
250a0 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68 65   target.  If the
250b0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
250c0 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
250d0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
250e0 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f  ght choose to co
250f0 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  de the expressio
25100 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  n at initializat
25110 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
25120 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
25130 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73  eFactorable(Pars
25140 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
25150 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
25160 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  et){.  if( pPars
25170 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
25180 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
25190 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
251a0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
251b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
251c0 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
251d0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  pr, target);.  }
251e0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
251f0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
25200 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
25210 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
25220 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
25230 74 20 65 76 61 6c 75 61 74 65 73 20 74 68 65 20  t evaluates the 
25240 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
25250 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65   and puts the re
25260 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73  sult.** in regis
25270 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a  ter target..**.*
25280 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f  * Also make a co
25290 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
252a0 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74  sion results int
252b0 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65  o another "cache
252c0 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e  " register.** an
252d0 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70  d modify the exp
252e0 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20  ression so that 
252f0 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74  the next time it
25300 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a   is evaluated,.*
25310 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  * the result is 
25320 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
25330 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  che register..**
25340 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25350 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70   is used for exp
25360 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
25370 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20  e used multiple 
25380 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79  .** times.  They
25390 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f   are evaluated o
253a0 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  nce and the resu
253b0 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  lts of the expre
253c0 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75  ssion.** are reu
253d0 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
253e0 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
253f0 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
25400 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
25410 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
25420 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
25430 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
25440 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Mem;..  assert( 
25450 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
25460 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
25470 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
25480 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
25490 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
254a0 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d   target);.  iMem
254b0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
254c0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
254d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
254e0 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29  y, target, iMem)
254f0 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
25500 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b  er(pExpr, iMem);
25510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
25520 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73  te code that pus
25530 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hes the value of
25540 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
25550 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  f the given.** e
25560 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69  xpression list i
25570 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f  nto a sequence o
25580 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  f registers begi
25590 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e  nning at target.
255a0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
255b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
255c0 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 20  ents evaluated. 
255d0 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
255e0 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a 20 75 73 75  rned will.** usu
255f0 61 6c 6c 79 20 62 65 20 70 4c 69 73 74 2d 3e 6e  ally be pList->n
25600 45 78 70 72 20 62 75 74 20 6d 69 67 68 74 20 62  Expr but might b
25610 65 20 72 65 64 75 63 65 64 20 69 66 20 53 51 4c  e reduced if SQL
25620 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
25630 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  .** is defined..
25640 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
25650 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70  _ECEL_DUP flag p
25660 72 65 76 65 6e 74 73 20 74 68 65 20 61 72 67 75  revents the argu
25670 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  ments from being
25680 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67  .** filled using
25690 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43   OP_SCopy.  OP_C
256a0 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73 65 64  opy must be used
256b0 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
256c0 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
256d0 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20  FACTOR argument 
256e0 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20  allows constant 
256f0 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a  arguments to be.
25700 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20  ** factored out 
25710 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  into initializat
25720 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion code..**.** 
25730 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
25740 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  REF flag means t
25750 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
25760 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74 68  in the list with
25770 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  .** ExprList.a[]
25780 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
25790 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  >0 have already 
257a0 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61  been evaluated a
257b0 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  nd stored.** in 
257c0 72 65 67 69 73 74 65 72 73 20 61 74 20 73 72 63  registers at src
257d0 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20  Reg, and so the 
257e0 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70  value can be cop
257f0 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a  ied from there..
25800 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 43 45  ** If SQLITE_ECE
25810 4c 5f 4f 4d 49 54 52 45 46 20 69 73 20 61 6c 73  L_OMITREF is als
25820 6f 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  o set, then the 
25830 76 61 6c 75 65 73 20 77 69 74 68 20 75 2e 78 2e  values with u.x.
25840 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 2a 2a  iOrderByCol>0.**
25850 20 61 72 65 20 73 69 6d 70 6c 79 20 6f 6d 69 74   are simply omit
25860 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
25870 62 65 69 6e 67 20 63 6f 70 69 65 64 20 66 72 6f  being copied fro
25880 6d 20 73 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e 74  m srcReg..*/.int
25890 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
258a0 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
258b0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
258c0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
258d0 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
258e0 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  *pList,   /* The
258f0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
25900 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
25910 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20    int target,   
25920 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
25930 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a   write results *
25940 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20  /.  int srcReg, 
25950 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
25960 20 72 65 67 69 73 74 65 72 73 20 69 66 20 53 51   registers if SQ
25970 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f  LITE_ECEL_REF */
25980 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20  .  u8 flags     
25990 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
259a0 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  ECEL_* flags */.
259b0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
259c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
259d0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
259e0 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28  .  u8 copyOp = (
259f0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25a00 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f  CEL_DUP) ? OP_Co
25a10 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20  py : OP_SCopy;. 
25a20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
25a30 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
25a40 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
25a50 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
25a60 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
25a70 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
25a80 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65   );  /* Never ge
25a90 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65  ts this far othe
25aa0 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70  rwise */.  n = p
25ab0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
25ac0 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f  f( !ConstFactorO
25ad0 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67  k(pParse) ) flag
25ae0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45  s &= ~SQLITE_ECE
25af0 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28  L_FACTOR;.  for(
25b00 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
25b10 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
25b20 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
25b30 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d  r *pExpr = pItem
25b40 2d 3e 70 45 78 70 72 3b 0a 23 69 66 64 65 66 20  ->pExpr;.#ifdef 
25b50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
25b60 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
25b70 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 62      if( pItem->b
25b80 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20  SorterRef ){.   
25b90 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 6e 2d     i--;.      n-
25ba0 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  -;.    }else.#en
25bb0 64 69 66 0a 20 20 20 20 69 66 28 20 28 66 6c 61  dif.    if( (fla
25bc0 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
25bd0 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d  _REF)!=0 && (j =
25be0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
25bf0 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20  erByCol)>0 ){.  
25c00 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
25c10 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
25c20 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69  REF ){.        i
25c30 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b  --;.        n--;
25c40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25c60 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f  eAddOp2(v, copyO
25c70 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74  p, j+srcReg-1, t
25c80 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
25c90 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
25ca0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
25cb0 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 0a  ECEL_FACTOR)!=0.
25cc0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
25cd0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
25ce0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
25cf0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
25d00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
25d10 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
25d20 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
25d30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25d40 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  int inReg = sqli
25d50 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
25d60 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
25d70 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
25d80 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
25d90 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20  get+i ){.       
25da0 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
25db0 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70        if( copyOp
25dc0 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
25dd0 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74     && (pOp=sqlit
25de0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d  e3VdbeGetOp(v, -
25df0 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  1))->opcode==OP_
25e00 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26  Copy.         &&
25e10 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33   pOp->p1+pOp->p3
25e20 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20  +1==inReg.      
25e30 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f     && pOp->p2+pO
25e40 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b  p->p3+1==target+
25e50 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  i.        ){.   
25e60 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b         pOp->p3++
25e70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25e80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25e90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25ea0 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74  copyOp, inReg, t
25eb0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
25ec0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25ed0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
25ee0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
25ef0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42  ate code for a B
25f00 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e  ETWEEN operator.
25f10 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57  .**.**    x BETW
25f20 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a  EEN y AND z.**.*
25f30 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65  * The above is e
25f40 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a  quivalent to .**
25f50 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20  .**    x>=y AND 
25f60 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20  x<=z.**.** Code 
25f70 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69  it as such, taki
25f80 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68  ng care to do th
25f90 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72  e common subexpr
25fa0 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e  ession.** elimin
25fb0 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a  ation of x..**.*
25fc0 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70 61  * The xJumpIf pa
25fd0 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
25fe0 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a  es details:.**.*
25ff0 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20  *    NULL:      
26000 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f               Sto
26010 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  re the boolean r
26020 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65 73  esult in reg[des
26030 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  t].**    sqlite3
26040 45 78 70 72 49 66 54 72 75 65 3a 20 20 20 20 20  ExprIfTrue:     
26050 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66   Jump to dest if
26060 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69   true.**    sqli
26070 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a 20  te3ExprIfFalse: 
26080 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74      Jump to dest
26090 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20   if false.**.** 
260a0 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70  The jumpIfNull p
260b0 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
260c0 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20 69  red if xJumpIf i
260d0 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  s NULL..*/.stati
260e0 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42  c void exprCodeB
260f0 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20  etween(.  Parse 
26100 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
26110 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
26120 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
26130 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
26140 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
26150 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73   BETWEEN express
26160 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
26170 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
26180 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  mp destination o
26190 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74 69  r storage locati
261a0 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  on */.  void (*x
261b0 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78 70  Jump)(Parse*,Exp
261c0 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20  r*,int,int), /* 
261d0 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a  Action to take *
261e0 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
261f0 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ll    /* Take th
26200 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
26210 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f  TWEEN is NULL */
26220 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72 41  .){.  Expr exprA
26230 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41  nd;     /* The A
26240 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20  ND operator in  
26250 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a  x>=y AND x<=z  *
26260 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66  /.  Expr compLef
26270 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e  t;    /* The  x>
26280 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =y  term */.  Ex
26290 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20  pr compRight;   
262a0 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65  /* The  x<=z  te
262b0 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  rm */.  int regF
262c0 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d  ree1 = 0; /* Tem
262d0 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
262e0 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
262f0 44 65 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Del = 0;.  sqlit
26300 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
26310 3e 64 62 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  >db;..  memset(&
26320 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73 69 7a  compLeft, 0, siz
26330 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65  eof(Expr));.  me
26340 6d 73 65 74 28 26 63 6f 6d 70 52 69 67 68 74 2c  mset(&compRight,
26350 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
26360 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 78 70  );.  memset(&exp
26370 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  rAnd, 0, sizeof(
26380 45 78 70 72 29 29 3b 0a 0a 20 20 61 73 73 65 72  Expr));..  asser
26390 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
263a0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
263b0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 44  sSelect) );.  pD
263c0 65 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  el = sqlite3Expr
263d0 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  Dup(db, pExpr->p
263e0 4c 65 66 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Left, 0);.  if( 
263f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
26400 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 70 72 41  ==0 ){.    exprA
26410 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
26420 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66      exprAnd.pLef
26430 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
26440 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68     exprAnd.pRigh
26450 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a  t = &compRight;.
26460 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20      compLeft.op 
26470 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 63 6f 6d  = TK_GE;.    com
26480 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 70 44  pLeft.pLeft = pD
26490 65 6c 3b 0a 20 20 20 20 63 6f 6d 70 4c 65 66 74  el;.    compLeft
264a0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
264b0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
264c0 45 78 70 72 3b 0a 20 20 20 20 63 6f 6d 70 52 69  Expr;.    compRi
264d0 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
264e0 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c      compRight.pL
264f0 65 66 74 20 3d 20 70 44 65 6c 3b 0a 20 20 20 20  eft = pDel;.    
26500 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74  compRight.pRight
26510 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
26520 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
26530 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65     exprToRegiste
26540 72 28 70 44 65 6c 2c 20 65 78 70 72 43 6f 64 65  r(pDel, exprCode
26550 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70  Vector(pParse, p
26560 44 65 6c 2c 20 26 72 65 67 46 72 65 65 31 29 29  Del, &regFree1))
26570 3b 0a 20 20 20 20 69 66 28 20 78 4a 75 6d 70 20  ;.    if( xJump 
26580 29 7b 0a 20 20 20 20 20 20 78 4a 75 6d 70 28 70  ){.      xJump(p
26590 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
265a0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
265b0 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
265c0 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65       /* Mark the
265d0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62   expression is b
265e0 65 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e  eing from the ON
265f0 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
26600 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 20   of a join.     
26610 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20   ** so that the 
26620 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
26630 61 72 67 65 74 28 29 20 72 6f 75 74 69 6e 65 20  arget() routine 
26640 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74  will not attempt
26650 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20 20 20 2a   to move.      *
26660 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20 50 61  * it into the Pa
26670 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72 20 6c  rse.pConstExpr l
26680 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  ist.  We should 
26690 75 73 65 20 61 20 6e 65 77 20 62 69 74 20 66 6f  use a new bit fo
266a0 72 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a  r this,.      **
266b0 20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20 62 75   for clarity, bu
266c0 74 20 77 65 20 61 72 65 20 6f 75 74 20 6f 66 20  t we are out of 
266d0 62 69 74 73 20 69 6e 20 74 68 65 20 45 78 70 72  bits in the Expr
266e0 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 73 6f 20  .flags field so 
266f0 77 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65  we.      ** have
26700 20 74 6f 20 72 65 75 73 65 20 74 68 65 20 45 50   to reuse the EP
26710 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20  _FromJoin bit.  
26720 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 20  Bummer. */.     
26730 20 70 44 65 6c 2d 3e 66 6c 61 67 73 20 7c 3d 20   pDel->flags |= 
26740 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20  EP_FromJoin;.   
26750 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
26760 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
26770 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 29   &exprAnd, dest)
26780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
26790 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
267a0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
267b0 65 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  e1);.  }.  sqlit
267c0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
267d0 20 70 44 65 6c 29 3b 0a 0a 20 20 2f 2a 20 45 6e   pDel);..  /* En
267e0 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65  sure adequate te
267f0 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20  st coverage */. 
26800 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
26810 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
26820 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
26830 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
26840 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
26850 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
26860 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
26870 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
26880 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
26890 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
268a0 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
268b0 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
268c0 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
268d0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
268e0 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
268f0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
26900 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
26910 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
26920 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
26930 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
26940 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
26950 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
26960 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
26970 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26980 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26990 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
269a0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
269b0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
269c0 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
269d0 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
269e0 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
269f0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26a00 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26a10 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
26a20 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
26a30 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
26a40 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
26a50 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d  e( xJump==0 );.}
26a60 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
26a70 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
26a80 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
26a90 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
26aa0 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
26ab0 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
26ac0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
26ad0 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
26ae0 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
26af0 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
26b00 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
26b10 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
26b20 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
26b30 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
26b40 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
26b50 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
26b60 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
26b70 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
26b80 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
26b90 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
26ba0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
26bb0 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
26bc0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
26bd0 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
26be0 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
26bf0 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
26c00 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
26c10 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
26c20 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
26c30 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
26c40 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
26c50 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
26c60 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
26c70 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
26c80 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
26c90 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
26ca0 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
26cb0 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
26cc0 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
26cd0 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
26ce0 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
26cf0 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
26d00 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
26d10 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26d20 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
26d30 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
26d40 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
26d50 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
26d60 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
26d70 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
26d80 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
26d90 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
26da0 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
26db0 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
26dc0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
26dd0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
26de0 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
26df0 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
26e00 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75  v==0) )     retu
26e10 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63  rn;  /* Existenc
26e20 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
26e30 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
26e40 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
26e50 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
26e60 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63  /* No way this c
26e70 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f  an happen */.  o
26e80 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
26e90 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
26ea0 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
26eb0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
26ec0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 41  {.      Expr *pA
26ed0 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
26ee0 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72 28  SimplifiedAndOr(
26ef0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
26f00 28 20 70 41 6c 74 21 3d 70 45 78 70 72 20 29 7b  ( pAlt!=pExpr ){
26f10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26f20 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
26f30 65 2c 20 70 41 6c 74 2c 20 64 65 73 74 2c 20 6a  e, pAlt, dest, j
26f40 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
26f50 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
26f60 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20  TK_AND ){.      
26f70 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
26f80 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
26f90 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
26fa0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
26fb0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
26fc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26fd0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
26fe0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
26ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27000 20 20 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70              jump
27010 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
27020 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
27030 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27040 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
27050 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
27060 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27080 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
27090 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , d2);.      }el
270a0 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
270b0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
270c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==0 );.        s
270d0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
270e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
270f0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
27100 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27110 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
27120 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
27130 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
27140 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
27150 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
27160 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
27170 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
27180 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27190 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
271a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
271b0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
271c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
271d0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
271e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
271f0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
27200 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UTH: {.      int
27210 20 69 73 4e 6f 74 3b 20 20 20 20 20 20 2f 2a 20   isNot;      /* 
27220 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49  IS NOT TRUE or I
27230 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20  S NOT FALSE */. 
27240 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b       int isTrue;
27250 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20       /* IS TRUE 
27260 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  or IS NOT TRUE *
27270 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
27280 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
27290 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d  );.      isNot =
272a0 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f   pExpr->op2==TK_
272b0 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73 54  ISNOT;.      isT
272c0 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rue = sqlite3Exp
272d0 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
272e0 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
272f0 20 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72    testcase( isTr
27300 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20  ue && isNot );. 
27310 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21       testcase( !
27320 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20  isTrue && isNot 
27330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  );.      if( isT
27340 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20  rue ^ isNot ){. 
27350 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
27360 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
27370 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
27380 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
27390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
273a0 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55  sNot ? SQLITE_JU
273b0 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20  MPIFNULL : 0);. 
273c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
273d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
273e0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
273f0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
27400 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
27420 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d  Not ? SQLITE_JUM
27430 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20  PIFNULL : 0);.  
27440 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
27450 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
27460 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
27470 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
27480 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
27490 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
274a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
274b0 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f  ISNOT );.      o
274c0 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
274d0 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
274e0 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c  .      jumpIfNul
274f0 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  l = SQLITE_NULLE
27500 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  Q;.      /* Fall
27510 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73   thru */.    cas
27520 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
27530 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
27540 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
27550 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
27560 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
27570 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
27580 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
27590 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e  IsVector(pExpr->
275a0 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65  pLeft) ) goto de
275b0 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20  fault_expr;.    
275c0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
275d0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
275e0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
275f0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
27600 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
27610 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
27620 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
27630 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
27640 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
27650 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
27660 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
27670 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
27680 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
27690 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
276b0 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
276c0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
276d0 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
276e0 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
276f0 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
27700 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
27710 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Lt);.      asse
27720 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
27730 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
27740 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
27750 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
27760 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
27770 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
27780 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
27790 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
277a0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
277b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
277c0 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
277d0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
277e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
277f0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
27800 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
27810 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
27820 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
27830 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27840 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
27850 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
27860 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
27870 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
27880 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
27890 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
278a0 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
278b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
278c0 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
278d0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
278e0 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
278f0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
27900 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
27910 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
27920 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
27930 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
27940 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
27950 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
27960 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LEQ);.      test
27970 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
27980 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
27990 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
279a0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
279b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
279c0 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
279d0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
279e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
279f0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
27a00 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
27a10 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
27a20 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
27a30 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
27a40 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
27a50 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
27a60 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
27a70 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
27a80 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
27a90 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
27aa0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
27ab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27ac0 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
27ad0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
27ae0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
27af0 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
27b00 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27b10 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
27b20 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
27b30 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
27b40 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
27b50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
27b60 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
27b70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
27b80 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
27b90 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
27ba0 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
27bb0 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65  pr, dest, sqlite
27bc0 33 45 78 70 72 49 66 54 72 75 65 2c 20 6a 75 6d  3ExprIfTrue, jum
27bd0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27be0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
27bf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27c00 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
27c10 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
27c20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
27c30 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
27c40 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
27c50 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
27c60 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e  IfNull = jumpIfN
27c70 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73  ull ? dest : des
27c80 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20  tIfFalse;.      
27c90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
27ca0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
27cb0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
27cc0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
27cd0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
27ce0 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
27cf0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27d00 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
27d10 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
27d20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
27d30 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
27d40 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65   {.    default_e
27d50 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20 45  xpr:.      if( E
27d60 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45  xprAlwaysTrue(pE
27d70 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
27d80 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
27d90 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
27da0 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 41 6c  }else if( ExprAl
27db0 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
27dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
27dd0 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
27de0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
27df0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
27e00 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
27e10 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
27e20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27e30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
27e40 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  _If, r1, dest, j
27e50 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
27e60 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
27e70 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
27e80 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
27e90 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
27ea0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
27eb0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
27ec0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
27ed0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
27ee0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
27ef0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
27f00 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
27f10 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
27f20 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
27f30 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65    .}../*.** Gene
27f40 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
27f50 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
27f60 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
27f70 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
27f80 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
27f90 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
27fa0 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75  sion is false bu
27fb0 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
27fc0 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
27fd0 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
27fe0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
27ff0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
28000 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
28010 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
28020 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
28030 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  lse) then.** jum
28040 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  p if jumpIfNull 
28050 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
28060 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72  NULL or fall thr
28070 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
28080 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76  ll.** is 0..*/.v
28090 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
280a0 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50  fFalse(Parse *pP
280b0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
280c0 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
280d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
280e0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
280f0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
28100 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
28110 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
28120 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
28130 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
28140 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
28150 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
28160 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
28170 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
28180 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
28190 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e  turn; /* Existen
281a0 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
281b0 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
281c0 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
281d0 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f      return;..  /
281e0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * The value of p
281f0 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20  Expr->op and op 
28200 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66  are related as f
28210 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
28220 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  *       pExpr->o
28230 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a  p            op.
28240 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d    **       -----
28250 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d  ----          --
28260 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
28270 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20      TK_ISNULL   
28280 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c         OP_NotNul
28290 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
282a0 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  NOTNULL         
282b0 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20  OP_IsNull.  **  
282c0 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20       TK_NE      
282d0 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20          OP_Eq.  
282e0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20  **       TK_EQ  
282f0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
28300 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
28310 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GT              
28320 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Le.  **      
28330 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20   TK_LE          
28340 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20      OP_Gt.  **  
28350 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20       TK_GE      
28360 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20          OP_Lt.  
28370 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20  **       TK_LT  
28380 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
28390 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  e.  **.  ** For 
283a0 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  other values of 
283b0 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73  pExpr->op, op is
283c0 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75   undefined and u
283d0 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20  nused..  ** The 
283e0 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64  value of TK_ and
283f0 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61   OP_ constants a
28400 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68  re arranged such
28410 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61   that we.  ** ca
28420 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  n compute the ma
28430 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e  pping above usin
28440 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
28450 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a  expression..  **
28460 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66   Assert()s verif
28470 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75  y that the compu
28480 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63  tation is correc
28490 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28  t..  */.  op = (
284a0 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49  (pExpr->op+(TK_I
284b0 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b  SNULL&1))^1)-(TK
284c0 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f  _ISNULL&1);..  /
284d0 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74  * Verify correct
284e0 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b   alignment of TK
284f0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
28500 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
28510 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
28520 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  _ISNULL || op==O
28530 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61  P_NotNull );.  a
28540 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
28550 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20  !=TK_NOTNULL || 
28560 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  op==OP_IsNull );
28570 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
28580 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f  ->op!=TK_NE || o
28590 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73  p==OP_Eq );.  as
285a0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
285b0 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_EQ || op==OP
285c0 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ne );.  assert(
285d0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
285e0 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29  T || op==OP_Ge )
285f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
28600 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op!=TK_LE || 
28610 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61  op==OP_Gt );.  a
28620 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
28630 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GT || op==O
28640 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Le );.  assert
28650 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
28660 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20  GE || op==OP_Lt 
28670 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
28680 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
28690 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
286a0 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
286b0 20 20 20 20 45 78 70 72 20 2a 70 41 6c 74 20 3d      Expr *pAlt =
286c0 20 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d 70   sqlite3ExprSimp
286d0 6c 69 66 69 65 64 41 6e 64 4f 72 28 70 45 78 70  lifiedAndOr(pExp
286e0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  r);.      if( pA
286f0 6c 74 21 3d 70 45 78 70 72 20 29 7b 0a 20 20 20  lt!=pExpr ){.   
28700 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28710 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
28720 70 41 6c 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  pAlt, dest, jump
28730 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
28740 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
28750 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
28760 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28770 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
28780 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28790 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
287a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
287b0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
287c0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ll);.        sql
287d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
287e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
287f0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
28800 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
28810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
28820 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
28830 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
28840 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  rse);.        te
28850 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
28860 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ll==0 );.       
28870 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
28880 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
28890 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 0a 20 20 20  ->pLeft, d2,.   
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288b0 20 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c         jumpIfNul
288c0 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
288d0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ULL);.        sq
288e0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
288f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
28900 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
28910 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
28920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
28930 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
28940 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28950 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
28960 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
28970 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28980 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
28990 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
289a0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
289b0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
289c0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
289d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
289e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
289f0 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20  K_TRUTH: {.     
28a00 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20 2f 2a   int isNot;   /*
28a10 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72 20   IS NOT TRUE or 
28a20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a  IS NOT FALSE */.
28a30 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65        int isTrue
28a40 3b 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72  ;  /* IS TRUE or
28a50 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a   IS NOT TRUE */.
28a60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28a70 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
28a80 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70  .      isNot = p
28a90 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53  Expr->op2==TK_IS
28aa0 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75  NOT;.      isTru
28ab0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54  e = sqlite3ExprT
28ac0 72 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d  ruthValue(pExpr-
28ad0 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
28ae0 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65  testcase( isTrue
28af0 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20   && isNot );.   
28b00 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
28b10 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b  True && isNot );
28b20 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72 75  .      if( isTru
28b30 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20  e ^ isNot ){.   
28b40 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20       /* IS TRUE 
28b50 61 6e 64 20 49 53 20 4e 4f 54 20 46 41 4c 53 45  and IS NOT FALSE
28b60 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
28b70 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
28b80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28b90 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20  eft, dest,.     
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bb0 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30 20        isNot ? 0 
28bc0 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  : SQLITE_JUMPIFN
28bd0 55 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 7d 65 6c  ULL);..      }el
28be0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
28bf0 53 20 46 41 4c 53 45 20 61 6e 64 20 49 53 20 4e  S FALSE and IS N
28c00 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20  OT TRUE */.     
28c10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
28c20 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
28c30 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
28c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28c50 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
28c60 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55   ? 0 : SQLITE_JU
28c70 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
28c80 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
28c90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
28ca0 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
28cb0 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
28cc0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
28cd0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
28ce0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
28cf0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
28d00 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
28d10 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
28d20 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
28d30 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  Q;.      jumpIfN
28d40 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
28d50 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
28d60 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
28d70 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
28d80 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
28d90 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
28da0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
28db0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
28dc0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
28dd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
28de0 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
28df0 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
28e00 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
28e10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
28e20 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
28e30 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
28e40 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
28e50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
28e60 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
28e70 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
28e80 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
28e90 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
28ea0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
28eb0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
28ec0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
28ed0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
28ee0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
28f00 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
28f10 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
28f20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
28f30 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
28f40 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
28f50 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
28f60 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
28f70 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
28f80 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
28f90 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
28fa0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
28fb0 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
28fc0 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
28fd0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
28fe0 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
28ff0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
29000 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
29010 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
29020 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
29030 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
29040 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
29050 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
29060 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
29070 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
29080 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
29090 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
290a0 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
290b0 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
290c0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
290d0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
290e0 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
290f0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
29100 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
29110 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
29120 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
29130 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
29140 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
29150 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
29160 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
29170 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
29180 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
29190 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
291a0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
291b0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
291c0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
291d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
291e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
291f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
29200 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
29210 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
29220 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
29230 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
29240 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
29250 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
29260 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
29270 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
29280 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
29290 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
292a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
292b0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20  p==TK_ISNULL ); 
292c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
292d0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
292e0 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
292f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
29300 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LL );  VdbeCover
29310 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
29320 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
29330 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
29340 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
29350 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
29360 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
29370 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
29380 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
29390 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
293a0 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
293b0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
293c0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
293d0 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
293e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
293f0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
29400 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
29410 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
29420 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
29430 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
29440 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
29450 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
29460 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
29470 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29480 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
29490 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
294a0 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
294b0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
294c0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
294d0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
294e0 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  t, destIfNull);.
294f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
29500 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
29510 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
29520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
29530 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
29540 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
29550 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70  .    default_exp
29560 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20 45 78  r: .      if( Ex
29570 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
29580 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
29590 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
295a0 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
295b0 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 41 6c  }else if( ExprAl
295c0 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
295d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  ){.        /* no
295e0 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
295f0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
29600 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
29610 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
29620 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
29630 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
29640 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
29650 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
29660 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
29670 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
29680 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
29690 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
296a0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
296b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
296c0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
296d0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
296e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
296f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
29700 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
29710 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
29720 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
29730 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
29740 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65  );.}../*.** Like
29750 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
29760 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61  lse() except tha
29770 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65  t a copy is made
29780 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65   of pExpr before
29790 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74  .** code generat
297a0 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f  ion, and that co
297b0 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66  py is deleted af
297c0 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ter code generat
297d0 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73  ion. This.** ens
297e0 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72  ures that the or
297f0 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20  iginal pExpr is 
29800 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
29810 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
29820 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a  FalseDup(Parse *
29830 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
29840 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e  xpr, int dest,in
29850 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
29860 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
29870 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
29880 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74  r *pCopy = sqlit
29890 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
298a0 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  xpr, 0);.  if( d
298b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
298c0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
298d0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
298e0 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74  rse, pCopy, dest
298f0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
29900 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
29910 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79  Delete(db, pCopy
29920 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72  );.}../*.** Expr
29930 65 73 73 69 6f 6e 20 70 56 61 72 20 69 73 20 67  ession pVar is g
29940 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
29950 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 2e  an SQL variable.
29960 20 70 45 78 70 72 20 6d 61 79 20 62 65 20 61 6e   pExpr may be an
29970 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65 78 70  y.** type of exp
29980 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ression..**.** I
29990 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d  f pExpr is a sim
299a0 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 2d 20  ple SQL value - 
299b0 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c  an integer, real
299c0 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a  , string, blob.*
299d0 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65 20  * or NULL value 
299e0 2d 20 74 68 65 6e 20 74 68 65 20 56 44 42 45 20  - then the VDBE 
299f0 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
29a00 70 72 65 70 61 72 65 64 20 69 73 20 63 6f 6e 66  prepared is conf
29a10 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72 65 2d  igured.** to re-
29a20 70 72 65 70 61 72 65 20 65 61 63 68 20 74 69 6d  prepare each tim
29a30 65 20 61 20 6e 65 77 20 76 61 6c 75 65 20 69 73  e a new value is
29a40 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62   bound to variab
29a50 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41  le pVar..**.** A
29a60 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20  dditionally, if 
29a70 70 45 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c  pExpr is a simpl
29a80 65 20 53 51 4c 20 76 61 6c 75 65 20 61 6e 64 20  e SQL value and 
29a90 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 68 65  the value is the
29aa0 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68 61 74  .** same as that
29ab0 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75 6e 64   currently bound
29ac0 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61   to variable pVa
29ad0 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  r, non-zero is r
29ae0 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65  eturned..** Othe
29af0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 76 61  rwise, if the va
29b00 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 74 68 65  lues are not the
29b10 20 73 61 6d 65 20 6f 72 20 69 66 20 70 45 78 70   same or if pExp
29b20 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c  r is not a simpl
29b30 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65 2c 20  e.** SQL value, 
29b40 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
29b50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29b60 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61  exprCompareVaria
29b70 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
29b80 65 2c 20 45 78 70 72 20 2a 70 56 61 72 2c 20 45  e, Expr *pVar, E
29b90 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
29ba0 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 6e  nt res = 0;.  in
29bb0 74 20 69 56 61 72 3b 0a 20 20 73 71 6c 69 74 65  t iVar;.  sqlite
29bc0 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a 70 52  3_value *pL, *pR
29bd0 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c 69 74   = 0;.  .  sqlit
29be0 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
29bf0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
29c00 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  r, SQLITE_UTF8, 
29c10 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c  SQLITE_AFF_BLOB,
29c20 20 26 70 52 29 3b 0a 20 20 69 66 28 20 70 52 20   &pR);.  if( pR 
29c30 29 7b 0a 20 20 20 20 69 56 61 72 20 3d 20 70 56  ){.    iVar = pV
29c40 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ar->iColumn;.   
29c50 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
29c60 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70  armask(pParse->p
29c70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20  Vdbe, iVar);.   
29c80 20 70 4c 20 3d 20 73 71 6c 69 74 65 33 56 64 62   pL = sqlite3Vdb
29c90 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70  eGetBoundValue(p
29ca0 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
29cb0 65 2c 20 69 56 61 72 2c 20 53 51 4c 49 54 45 5f  e, iVar, SQLITE_
29cc0 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20 20 69  AFF_BLOB);.    i
29cd0 66 28 20 70 4c 20 29 7b 0a 20 20 20 20 20 20 69  f( pL ){.      i
29ce0 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
29cf0 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c 49 54  _type(pL)==SQLIT
29d00 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
29d10 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
29d20 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b  text(pL); /* Mak
29d30 65 20 73 75 72 65 20 74 68 65 20 65 6e 63 6f 64  e sure the encod
29d40 69 6e 67 20 69 73 20 55 54 46 2d 38 20 2a 2f 0a  ing is UTF-8 */.
29d50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
29d60 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65 33 4d  s =  0==sqlite3M
29d70 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20 70 52  emCompare(pL, pR
29d80 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
29d90 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
29da0 28 70 52 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (pR);.    sqlite
29db0 33 56 61 6c 75 65 46 72 65 65 28 70 4c 29 3b 0a  3ValueFree(pL);.
29dc0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65    }..  return re
29dd0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  s;.}../*.** Do a
29de0 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
29df0 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
29e00 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
29e10 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
29e20 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
29e30 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
29e40 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
29e50 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
29e60 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
29e70 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
29e80 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
29e90 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
29ea0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
29eb0 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
29ec0 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
29ed0 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
29ee0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
29ef0 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
29f00 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
29f10 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
29f20 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
29f30 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
29f40 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
29f50 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
29f60 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
29f70 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41  ab..**.** The pA
29f80 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75   side might be u
29f90 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
29fa0 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
29fb0 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73  e case and pB is
29fc0 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b  .** not using TK
29fd0 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73  _REGISTER but is
29fe0 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76   otherwise equiv
29ff0 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c  alent, then stil
2a000 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  l return 0..**.*
2a010 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
2a020 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
2a030 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
2a040 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
2a050 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
2a060 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
2a070 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
2a080 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
2a090 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
2a0a0 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
2a0b0 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
2a0c0 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
2a0d0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
2a0e0 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
2a0f0 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
2a100 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
2a110 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
2a120 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
2a130 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
2a140 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
2a150 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
2a160 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
2a170 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
2a180 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
2a190 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
2a1a0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
2a1b0 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
2a1c0 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
2a1d0 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
2a1e0 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
2a1f0 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
2a200 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
2a210 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
2a220 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
2a230 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
2a240 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
2a250 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  alfunction..**.*
2a260 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e  * If pParse is n
2a270 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54 4b 5f  ot NULL then TK_
2a280 56 41 52 49 41 42 4c 45 20 74 65 72 6d 73 20 69  VARIABLE terms i
2a290 6e 20 70 41 20 77 69 74 68 20 62 69 6e 64 69 6e  n pA with bindin
2a2a0 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  gs in.** pParse-
2a2b0 3e 70 52 65 70 72 65 70 61 72 65 20 63 61 6e 20  >pReprepare can 
2a2c0 62 65 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e  be matched again
2a2d0 73 74 20 6c 69 74 65 72 61 6c 73 20 69 6e 20 70  st literals in p
2a2e0 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50 61 72  B.  The .** pPar
2a2f0 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61  se->pVdbe->expma
2a300 73 6b 20 62 69 74 6d 61 73 6b 20 69 73 20 75 70  sk bitmask is up
2a310 64 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 76  dated for each v
2a320 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63  ariable referenc
2a330 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72 73 65  ed..** If pParse
2a340 20 69 73 20 4e 55 4c 4c 20 28 74 68 65 20 6e 6f   is NULL (the no
2a350 72 6d 61 6c 20 63 61 73 65 29 20 74 68 65 6e 20  rmal case) then 
2a360 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c 45 20  any TK_VARIABLE 
2a370 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72 67 75  term in .** Argu
2a380 6d 65 6e 74 20 70 50 61 72 73 65 20 73 68 6f 75  ment pParse shou
2a390 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 4e  ld normally be N
2a3a0 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ULL. If it is no
2a3b0 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20 6f 72  t NULL and pA or
2a3c0 0a 2a 2a 20 70 42 20 63 61 75 73 65 73 20 61 20  .** pB causes a 
2a3d0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
2a3e0 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  2..*/.int sqlite
2a3f0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 50 61 72  3ExprCompare(Par
2a400 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2a410 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20   *pA, Expr *pB, 
2a420 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32  int iTab){.  u32
2a430 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a   combinedFlags;.
2a440 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
2a450 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  B==0 ){.    retu
2a460 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20  rn pB==pA ? 0 : 
2a470 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  2;.  }.  if( pPa
2a480 72 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d 3d 54  rse && pA->op==T
2a490 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20 65 78  K_VARIABLE && ex
2a4a0 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c  prCompareVariabl
2a4b0 65 28 70 50 61 72 73 65 2c 20 70 41 2c 20 70 42  e(pParse, pA, pB
2a4c0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2a4d0 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65  0;.  }.  combine
2a4e0 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61  dFlags = pA->fla
2a4f0 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a  gs | pB->flags;.
2a500 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c    if( combinedFl
2a510 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
2a520 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41  e ){.    if( (pA
2a530 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67  ->flags&pB->flag
2a540 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  s&EP_IntValue)!=
2a550 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75  0 && pA->u.iValu
2a560 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20  e==pB->u.iValue 
2a570 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2a580 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  0;.    }.    ret
2a590 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
2a5a0 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20   pA->op!=pB->op 
2a5b0 7c 7c 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 52 41  || pA->op==TK_RA
2a5c0 49 53 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ISE ){.    if( p
2a5d0 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  A->op==TK_COLLAT
2a5e0 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  E && sqlite3Expr
2a5f0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
2a600 70 41 2d 3e 70 4c 65 66 74 2c 70 42 2c 69 54 61  pA->pLeft,pB,iTa
2a610 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
2a620 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2a630 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b    if( pB->op==TK
2a640 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
2a650 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a660 50 61 72 73 65 2c 20 70 41 2c 70 42 2d 3e 70 4c  Parse, pA,pB->pL
2a670 65 66 74 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20  eft,iTab)<2 ){. 
2a680 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2a690 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2a6a0 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
2a6b0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op!=TK_COLUMN &
2a6c0 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  & pA->op!=TK_AGG
2a6d0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75  _COLUMN && pA->u
2a6e0 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69  .zToken ){.    i
2a6f0 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55  f( pA->op==TK_FU
2a700 4e 43 54 49 4f 4e 20 7c 7c 20 70 41 2d 3e 6f 70  NCTION || pA->op
2a710 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
2a720 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  N ){.      if( s
2a730 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 41  qlite3StrICmp(pA
2a740 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
2a750 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65  .zToken)!=0 ) re
2a760 74 75 72 6e 20 32 3b 0a 23 69 66 6e 64 65 66 20  turn 2;.#ifndef 
2a770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
2a780 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 61 73 73  OWFUNC.      ass
2a790 65 72 74 28 20 70 41 2d 3e 6f 70 3d 3d 70 42 2d  ert( pA->op==pB-
2a7a0 3e 6f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >op );.      if(
2a7b0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
2a7c0 28 70 41 2c 45 50 5f 57 69 6e 46 75 6e 63 29 21  (pA,EP_WinFunc)!
2a7d0 3d 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  =ExprHasProperty
2a7e0 28 70 42 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20  (pB,EP_WinFunc) 
2a7f0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2a800 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 2;.      }.   
2a810 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
2a820 6f 70 65 72 74 79 28 70 41 2c 45 50 5f 57 69 6e  operty(pA,EP_Win
2a830 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
2a840 20 69 66 28 20 73 71 6c 69 74 65 33 57 69 6e 64   if( sqlite3Wind
2a850 6f 77 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  owCompare(pParse
2a860 2c 20 70 41 2d 3e 79 2e 70 57 69 6e 2c 20 70 42  , pA->y.pWin, pB
2a870 2d 3e 79 2e 70 57 69 6e 2c 20 31 29 21 3d 30 20  ->y.pWin, 1)!=0 
2a880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2a890 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 20 20 7d  urn 2;.        }
2a8a0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2a8b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
2a8c0 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b  ->op==TK_NULL ){
2a8d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
2a8e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
2a8f0 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  A->op==TK_COLLAT
2a900 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  E ){.      if( s
2a910 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
2a920 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
2a930 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72  u.zToken)!=0 ) r
2a940 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c  eturn 2;.    }el
2a950 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 42  se if( ALWAYS(pB
2a960 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 29 20 26  ->u.zToken!=0) &
2a970 26 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a  & strcmp(pA->u.z
2a980 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
2a990 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  en)!=0 ){.      
2a9a0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
2a9b0 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66    }.  if( (pA->f
2a9c0 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
2a9d0 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
2a9e0 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
2a9f0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
2aa00 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20   (combinedFlags 
2aa10 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d  & EP_TokenOnly)=
2aa20 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  =0 ){.    if( co
2aa30 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
2aa40 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74  _xIsSelect ) ret
2aa50 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 28  urn 2;.    if( (
2aa60 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
2aa70 45 50 5f 46 69 78 65 64 43 6f 6c 29 3d 3d 30 0a  EP_FixedCol)==0.
2aa80 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
2aa90 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2aaa0 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  e, pA->pLeft, pB
2aab0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29  ->pLeft, iTab) )
2aac0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
2aad0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2aae0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41  mpare(pParse, pA
2aaf0 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
2ab00 69 67 68 74 2c 20 69 54 61 62 29 20 29 20 72 65  ight, iTab) ) re
2ab10 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
2ab20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
2ab30 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69  ompare(pA->x.pLi
2ab40 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c  st, pB->x.pList,
2ab50 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
2ab60 32 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  2;.    if( pA->o
2ab70 70 21 3d 54 4b 5f 53 54 52 49 4e 47 0a 20 20 20  p!=TK_STRING.   
2ab80 20 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f    && pA->op!=TK_
2ab90 54 52 55 45 46 41 4c 53 45 0a 20 20 20 20 20 26  TRUEFALSE.     &
2aba0 26 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  & (combinedFlags
2abb0 20 26 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d   & EP_Reduced)==
2abc0 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
2abd0 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  f( pA->iColumn!=
2abe0 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65  pB->iColumn ) re
2abf0 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66  turn 2;.      if
2ac00 28 20 70 41 2d 3e 6f 70 32 21 3d 70 42 2d 3e 6f  ( pA->op2!=pB->o
2ac10 70 32 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  p2 ) return 2;. 
2ac20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61       if( pA->iTa
2ac30 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20  ble!=pB->iTable 
2ac40 0a 20 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e  .       && (pA->
2ac50 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20  iTable!=iTab || 
2ac60 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65  NEVER(pB->iTable
2ac70 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20 32  >=0)) ) return 2
2ac80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2ac90 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2aca0 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70   Compare two Exp
2acb0 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20  rList objects.  
2acc0 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 79  Return 0 if they
2acd0 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61   are identical a
2ace0 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  nd .** non-zero 
2acf0 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69  if they differ i
2ad00 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
2ad10 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65   If any subeleme
2ad20 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70  nt of pB has Exp
2ad30 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74  r.iTable==(-1) t
2ad40 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65  hen it is allowe
2ad50 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20  d.** to compare 
2ad60 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69  equal to an equi
2ad70 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69  valent element i
2ad80 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69  n pA with Expr.i
2ad90 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a  Table==iTab..**.
2ada0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2adb0 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e  might return non
2adc0 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61  -zero for equiva
2add0 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20  lent ExprLists. 
2ade0 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e   The.** only con
2adf0 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65  sequence will be
2ae00 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69   disabled optimi
2ae10 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  zations.  But th
2ae20 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75  is routine.** mu
2ae30 73 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20  st never return 
2ae40 30 20 69 66 20 74 68 65 20 74 77 6f 20 45 78 70  0 if the two Exp
2ae50 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72  rList objects ar
2ae60 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a  e different, or.
2ae70 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ** a malfunction
2ae80 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a   will result..**
2ae90 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69  .** Two NULL poi
2aea0 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64  nters are consid
2aeb0 65 72 65 64 20 74 6f 20 62 65 20 74 68 65 20 73  ered to be the s
2aec0 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c  ame.  But a NULL
2aed0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61   pointer.** alwa
2aee0 79 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  ys differs from 
2aef0 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74  a non-NULL point
2af00 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
2af10 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
2af20 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20  e(ExprList *pA, 
2af30 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e  ExprList *pB, in
2af40 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69  t iTab){.  int i
2af50 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26  ;.  if( pA==0 &&
2af60 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pB==0 ) return 
2af70 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c  0;.  if( pA==0 |
2af80 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e  | pB==0 ) return
2af90 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45   1;.  if( pA->nE
2afa0 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29  xpr!=pB->nExpr )
2afb0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72   return 1;.  for
2afc0 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70  (i=0; i<pA->nExp
2afd0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
2afe0 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e  r *pExprA = pA->
2aff0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
2b000 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70  Expr *pExprB = p
2b010 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  B->a[i].pExpr;. 
2b020 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e     if( pA->a[i].
2b030 73 6f 72 74 46 6c 61 67 73 21 3d 70 42 2d 3e 61  sortFlags!=pB->a
2b040 5b 69 5d 2e 73 6f 72 74 46 6c 61 67 73 20 29 20  [i].sortFlags ) 
2b050 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
2b060 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2b070 70 61 72 65 28 30 2c 20 70 45 78 70 72 41 2c 20  pare(0, pExprA, 
2b080 70 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20  pExprB, iTab) ) 
2b090 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2b0a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2b0b0 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45  ** Like sqlite3E
2b0c0 78 70 72 43 6f 6d 70 61 72 65 28 29 20 65 78 63  xprCompare() exc
2b0d0 65 70 74 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ept COLLATE oper
2b0e0 61 74 6f 72 73 20 61 74 20 74 68 65 20 74 6f 70  ators at the top
2b0f0 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67  -level.** are ig
2b100 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
2b110 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2b120 53 6b 69 70 28 45 78 70 72 20 2a 70 41 2c 20 45  Skip(Expr *pA, E
2b130 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61  xpr *pB, int iTa
2b140 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  b){.  return sql
2b150 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2b160 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2b170 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
2b180 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28  ollateAndLikely(
2b190 70 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pA),.           
2b1a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69    sqlite3ExprSki
2b1b0 70 43 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b 65 6c  pCollateAndLikel
2b1c0 79 28 70 42 29 2c 0a 20 20 20 20 20 20 20 20 20  y(pB),.         
2b1d0 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a      iTab);.}../*
2b1e0 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
2b1f0 65 72 6f 20 69 66 20 45 78 70 72 20 70 20 63 61  ero if Expr p ca
2b200 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69  n only be true i
2b210 66 20 70 4e 4e 20 69 73 20 6e 6f 74 20 4e 55 4c  f pNN is not NUL
2b220 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 72 20 69 66 20 73  L..**.** Or if s
2b230 65 65 6e 4e 6f 74 20 69 73 20 74 72 75 65 2c 20  eenNot is true, 
2b240 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
2b250 69 66 20 45 78 70 72 20 70 20 63 61 6e 20 6f 6e  if Expr p can on
2b260 6c 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c  ly be.** non-NUL
2b270 4c 20 69 66 20 70 4e 4e 20 69 73 20 6e 6f 74 20  L if pNN is not 
2b280 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NULL.*/.static i
2b290 6e 74 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f  nt exprImpliesNo
2b2a0 74 4e 75 6c 6c 28 0a 20 20 50 61 72 73 65 20 2a  tNull(.  Parse *
2b2b0 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
2b2c0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
2b2d0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 2c 20 20 20  */.  Expr *p,   
2b2e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2b2f0 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
2b300 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 45 78   checked */.  Ex
2b310 70 72 20 2a 70 4e 4e 2c 20 20 20 20 20 20 20 20  pr *pNN,        
2b320 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
2b330 69 6f 6e 20 74 68 61 74 20 69 73 20 4e 4f 54 20  ion that is NOT 
2b340 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 54  NULL */.  int iT
2b350 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab,           /*
2b360 20 54 61 62 6c 65 20 62 65 69 6e 67 20 65 76 61   Table being eva
2b370 6c 75 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  luated */.  int 
2b380 73 65 65 6e 4e 6f 74 20 20 20 20 20 20 20 20 20  seenNot         
2b390 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 6f  /* Return true o
2b3a0 6e 6c 79 20 69 66 20 70 20 63 61 6e 20 62 65 20  nly if p can be 
2b3b0 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  any non-NULL val
2b3c0 75 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ue */.){.  asser
2b3d0 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74  t( p );.  assert
2b3e0 28 20 70 4e 4e 20 29 3b 0a 20 20 69 66 28 20 73  ( pNN );.  if( s
2b3f0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2b400 65 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4e 4e  e(pParse, p, pNN
2b410 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  , iTab)==0 ){.  
2b420 20 20 72 65 74 75 72 6e 20 70 4e 4e 2d 3e 6f 70    return pNN->op
2b430 21 3d 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 0a 20  !=TK_NULL;.  }. 
2b440 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
2b450 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
2b460 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 65  : {.      if( se
2b470 65 6e 4e 6f 74 20 26 26 20 45 78 70 72 48 61 73  enNot && ExprHas
2b480 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
2b490 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74 75  IsSelect) ) retu
2b4a0 72 6e 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65  rn 0;.      asse
2b4b0 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
2b4c0 72 74 79 28 70 2c 45 50 5f 78 49 73 53 65 6c 65  rty(p,EP_xIsSele
2b4d0 63 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ct).           |
2b4e0 7c 20 28 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  | (p->x.pList!=0
2b4f0 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e   && p->x.pList->
2b500 6e 45 78 70 72 3e 30 29 20 29 3b 0a 20 20 20 20  nExpr>0) );.    
2b510 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 6d 70    return exprImp
2b520 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61 72  liesNotNull(pPar
2b530 73 65 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 70 4e  se, p->pLeft, pN
2b540 4e 2c 20 69 54 61 62 2c 20 31 29 3b 0a 20 20 20  N, iTab, 1);.   
2b550 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
2b560 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
2b570 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
2b580 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  = p->x.pList;.  
2b590 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
2b5a0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  t!=0 );.      as
2b5b0 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
2b5c0 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 20 20 69  pr==2 );.      i
2b5d0 66 28 20 73 65 65 6e 4e 6f 74 20 29 20 72 65 74  f( seenNot ) ret
2b5e0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28  urn 0;.      if(
2b5f0 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2b600 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ull(pParse, pLis
2b610 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
2b620 4e 4e 2c 20 69 54 61 62 2c 20 31 29 0a 20 20 20  NN, iTab, 1).   
2b630 20 20 20 20 7c 7c 20 65 78 70 72 49 6d 70 6c 69      || exprImpli
2b640 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65  esNotNull(pParse
2b650 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  , pList->a[1].pE
2b660 78 70 72 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20  xpr, pNN, iTab, 
2b670 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1).      ){.    
2b680 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2b690 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2b6a0 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f  rn exprImpliesNo
2b6b0 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d  tNull(pParse, p-
2b6c0 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61  >pLeft, pNN, iTa
2b6d0 62 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, 1);.    }.   
2b6e0 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20   case TK_EQ:.   
2b6f0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
2b700 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
2b710 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
2b720 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
2b730 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
2b740 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
2b750 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
2b760 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
2b770 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
2b780 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73  _LSHIFT:.    cas
2b790 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20  e TK_RSHIFT: .  
2b7a0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
2b7b0 3a 20 0a 20 20 20 20 20 20 73 65 65 6e 4e 6f 74  : .      seenNot
2b7c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46   = 1;.      /* F
2b7d0 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
2b7e0 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
2b7f0 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20    case TK_REM:. 
2b800 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
2b810 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  D:.    case TK_S
2b820 4c 41 53 48 3a 20 7b 0a 20 20 20 20 20 20 69 66  LASH: {.      if
2b830 28 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74  ( exprImpliesNot
2b840 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e  Null(pParse, p->
2b850 70 52 69 67 68 74 2c 20 70 4e 4e 2c 20 69 54 61  pRight, pNN, iTa
2b860 62 2c 20 73 65 65 6e 4e 6f 74 29 20 29 20 72 65  b, seenNot) ) re
2b870 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 2f 2a  turn 1;.      /*
2b880 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20   Fall thru into 
2b890 74 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f  the next case */
2b8a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2b8b0 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61 73  TK_SPAN:.    cas
2b8c0 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 0a 20 20  e TK_COLLATE:.  
2b8d0 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
2b8e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
2b8f0 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  NUS: {.      ret
2b900 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e  urn exprImpliesN
2b910 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70  otNull(pParse, p
2b920 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54  ->pLeft, pNN, iT
2b930 61 62 2c 20 73 65 65 6e 4e 6f 74 29 3b 0a 20 20  ab, seenNot);.  
2b940 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
2b950 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69  TRUTH: {.      i
2b960 66 28 20 73 65 65 6e 4e 6f 74 20 29 20 72 65 74  f( seenNot ) ret
2b970 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28  urn 0;.      if(
2b980 20 70 2d 3e 6f 70 32 21 3d 54 4b 5f 49 53 20 29   p->op2!=TK_IS )
2b990 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
2b9a0 20 72 65 74 75 72 6e 20 65 78 70 72 49 6d 70 6c   return exprImpl
2b9b0 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73  iesNotNull(pPars
2b9c0 65 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e  e, p->pLeft, pNN
2b9d0 2c 20 69 54 61 62 2c 20 31 29 3b 0a 20 20 20 20  , iTab, 1);.    
2b9e0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
2b9f0 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
2ba00 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 72  K_NOT: {.      r
2ba10 65 74 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65  eturn exprImplie
2ba20 73 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c  sNotNull(pParse,
2ba30 20 70 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20   p->pLeft, pNN, 
2ba40 69 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  iTab, 1);.    }.
2ba50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2ba60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2ba70 74 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70  true if we can p
2ba80 72 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c  rove the pE2 wil
2ba90 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65  l always be true
2baa0 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72   if pE1 is.** tr
2bab0 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ue.  Return fals
2bac0 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63  e if we cannot c
2bad0 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f  omplete the proo
2bae0 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68  f or if pE2 migh
2baf0 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20  t.** be false.  
2bb00 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
2bb10 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20      pE1: x==5   
2bb20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
2bb30 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
2bb40 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
2bb50 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45  1: x>0        pE
2bb60 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20  2: x==5         
2bb70 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73      Result: fals
2bb80 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d  e.**     pE1: x=
2bb90 32 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  21       pE2: x=
2bba0 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52  21 OR y=43     R
2bbb0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
2bbc0 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20     pE1: x!=123  
2bbd0 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
2bbe0 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
2bbf0 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
2bc00 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32  : x!=?1      pE2
2bc10 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2bc20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
2bc30 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53  **     pE1: x IS
2bc40 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53   NULL  pE2: x IS
2bc50 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73   NOT NULL    Res
2bc60 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
2bc70 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20    pE1: x IS ?2  
2bc80 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
2bc90 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20  NULL    Reuslt: 
2bca0 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  false.**.** When
2bcb0 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f   comparing TK_CO
2bcc0 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65  LUMN nodes betwe
2bcd0 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20  en pE1 and pE2, 
2bce0 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78  if pE2 has.** Ex
2bcf0 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e  pr.iTable<0 then
2bd00 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20   assume a table 
2bd10 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20  number given by 
2bd20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  iTab..**.** If p
2bd30 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c  Parse is not NUL
2bd40 4c 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  L, then the valu
2bd50 65 73 20 6f 66 20 62 6f 75 6e 64 20 76 61 72 69  es of bound vari
2bd60 61 62 6c 65 73 20 69 6e 20 70 45 31 20 61 72 65  ables in pE1 are
2bd70 20 0a 2a 2a 20 63 6f 6d 70 61 72 65 64 20 61 67   .** compared ag
2bd80 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 20 76 61  ainst literal va
2bd90 6c 75 65 73 20 69 6e 20 70 45 32 20 61 6e 64 20  lues in pE2 and 
2bda0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65  pParse->pVdbe->e
2bdb0 78 70 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64  xpmask is.** mod
2bdc0 69 66 69 65 64 20 74 6f 20 72 65 63 6f 72 64 20  ified to record 
2bdd0 77 68 69 63 68 20 62 6f 75 6e 64 20 76 61 72 69  which bound vari
2bde0 61 62 6c 65 73 20 61 72 65 20 72 65 66 65 72 65  ables are refere
2bdf0 6e 63 65 64 2e 20 20 49 66 20 70 50 61 72 73 65  nced.  If pParse
2be00 20 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68   .** is NULL, th
2be10 65 6e 20 66 61 6c 73 65 20 77 69 6c 6c 20 62 65  en false will be
2be20 20 72 65 74 75 72 6e 65 64 20 69 66 20 70 45 31   returned if pE1
2be30 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 62 6f   contains any bo
2be40 75 6e 64 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  und variables..*
2be50 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75  *.** When in dou
2be60 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  bt, return false
2be70 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75  .  Returning tru
2be80 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  e might give a p
2be90 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d  erformance.** im
2bea0 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75  provement.  Retu
2beb0 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68  rning false migh
2bec0 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72  t cause a perfor
2bed0 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c  mance reduction,
2bee0 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20   but.** it will 
2bef0 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20  always give the 
2bf00 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61  correct answer a
2bf10 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61  nd is hence alwa
2bf20 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20  ys safe..*/.int 
2bf30 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2bf40 65 73 45 78 70 72 28 50 61 72 73 65 20 2a 70 50  esExpr(Parse *pP
2bf50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c  arse, Expr *pE1,
2bf60 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20   Expr *pE2, int 
2bf70 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c  iTab){.  if( sql
2bf80 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2bf90 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
2bfa0 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  , iTab)==0 ){.  
2bfb0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2bfc0 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
2bfd0 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69  K_OR.   && (sqli
2bfe0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
2bff0 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20  pr(pParse, pE1, 
2c000 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
2c010 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  ).             |
2c020 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  | sqlite3ExprImp
2c030 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c  liesExpr(pParse,
2c040 20 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68   pE1, pE2->pRigh
2c050 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a  t, iTab) ).  ){.
2c060 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2c070 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d  }.  if( pE2->op=
2c080 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
2c090 26 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74  & exprImpliesNot
2c0a0 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 45 31  Null(pParse, pE1
2c0b0 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54  , pE2->pLeft, iT
2c0c0 61 62 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20  ab, 0).  ){.    
2c0d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2c0e0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2c0f0 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 45  ** This is the E
2c100 78 70 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63  xpr node callbac
2c110 6b 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70  k for sqlite3Exp
2c120 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52  rImpliesNotNullR
2c130 6f 77 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ow()..** If the 
2c140 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
2c150 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68  requires that th
2c160 65 20 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b  e table at pWalk
2c170 65 72 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65  er->iCur.** have
2c180 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 6f 6e   one or more non
2c190 2d 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68  -NULL column, th
2c1a0 65 6e 20 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e  en set pWalker->
2c1b0 65 43 6f 64 65 20 74 6f 20 31 20 61 6e 64 20 61  eCode to 1 and a
2c1c0 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bort..**.** This
2c1d0 20 72 6f 75 74 69 6e 65 20 63 6f 6e 74 72 6f 6c   routine control
2c1e0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
2c1f0 6e 2e 20 20 46 61 6c 73 65 20 70 6f 73 69 74 69  n.  False positi
2c200 76 65 73 20 28 73 65 74 74 69 6e 67 0a 2a 2a 20  ves (setting.** 
2c210 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74  pWalker->eCode t
2c220 6f 20 31 20 77 68 65 6e 20 69 74 20 73 68 6f 75  o 1 when it shou
2c230 6c 64 20 6e 6f 74 20 62 65 29 20 61 72 65 20 64  ld not be) are d
2c240 65 61 64 6c 79 2c 20 62 75 74 20 66 61 6c 73 65  eadly, but false
2c250 2d 6e 65 67 61 74 69 76 65 73 0a 2a 2a 20 28 6e  -negatives.** (n
2c260 65 76 65 72 20 73 65 74 74 69 6e 67 20 70 57 61  ever setting pWa
2c270 6c 6b 65 72 2d 3e 65 43 6f 64 65 29 20 69 73 20  lker->eCode) is 
2c280 61 20 68 61 72 6d 6c 65 73 73 20 6d 69 73 73 65  a harmless misse
2c290 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  d optimization..
2c2a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6d  */.static int im
2c2b0 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28  pliesNotNullRow(
2c2c0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2c2d0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2c2e0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2c2f0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
2c300 55 4d 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73  UMN );.  testcas
2c310 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2c320 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
2c330 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
2c340 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2c350 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
2c360 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2c370 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
2c380 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
2c390 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73  K_ISNOT:.    cas
2c3a0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
2c3b0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
2c3c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
2c3d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
2c3e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  :.    case TK_CA
2c3f0 53 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SE:.    case TK_
2c400 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IN:.    case TK_
2c410 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
2c420 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2c430 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
2c440 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2c450 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2c460 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
2c470 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2c480 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
2c490 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2c4a0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c4b0 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
2c4c0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2c4d0 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20  =TK_OR );.      
2c4e0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2c4f0 3e 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a  >op==TK_CASE );.
2c500 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c510 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
2c520 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c530 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c540 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  K_FUNCTION );.  
2c550 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2c560 72 75 6e 65 3b 0a 20 20 20 20 63 61 73 65 20 54  rune;.    case T
2c570 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  K_COLUMN:.      
2c580 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  if( pWalker->u.i
2c590 43 75 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  Cur==pExpr->iTab
2c5a0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57  le ){.        pW
2c5b0 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31  alker->eCode = 1
2c5c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2c5d0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
2c5e0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
2c5f0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20   WRC_Prune;..   
2c600 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
2c610 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2c620 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c  xprImpliesNonNul
2c630 6c 52 6f 77 28 70 45 78 70 72 2d 3e 70 4c 65 66  lRow(pExpr->pLef
2c640 74 2c 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43  t, pWalker->u.iC
2c650 75 72 29 0a 20 20 20 20 20 20 20 26 26 20 73 71  ur).       && sq
2c660 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2c670 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70 45 78 70 72  NonNullRow(pExpr
2c680 2d 3e 70 52 69 67 68 74 2c 20 70 57 61 6c 6b 65  ->pRight, pWalke
2c690 72 2d 3e 75 2e 69 43 75 72 29 0a 20 20 20 20 20  r->u.iCur).     
2c6a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c   ){.        pWal
2c6b0 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
2c6c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2c6d0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2c6e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
2c6f0 57 45 45 4e 3a 0a 20 20 20 20 20 20 73 71 6c 69  WEEN:.      sqli
2c700 74 65 33 57 61 6c 6b 45 78 70 72 28 70 57 61 6c  te3WalkExpr(pWal
2c710 6b 65 72 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  ker, pExpr->pLef
2c720 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
2c730 20 57 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20   WRC_Prune;..   
2c740 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2c750 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  es are allowed t
2c760 6f 20 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  o use constraint
2c770 73 20 6c 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20  s like x=NULL.  
2c780 53 6f 0a 20 20 20 20 2a 2a 20 61 20 74 65 72 6d  So.    ** a term
2c790 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 79   of the form x=y
2c7a0 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 65 20   does not prove 
2c7b0 74 68 61 74 20 79 20 69 73 20 6e 6f 74 20 6e 75  that y is not nu
2c7c0 6c 6c 20 69 66 20 78 0a 20 20 20 20 2a 2a 20 69  ll if x.    ** i
2c7d0 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  s the column of 
2c7e0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
2c7f0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  */.    case TK_E
2c800 51 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  Q:.    case TK_N
2c810 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  E:.    case TK_L
2c820 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
2c830 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
2c840 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
2c850 45 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  E:.      testcas
2c860 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2c870 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _EQ );.      tes
2c880 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c890 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20  ==TK_NE );.     
2c8a0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2c8b0 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ->op==TK_LT );. 
2c8c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2c8d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
2c8e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2c8f0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2c900 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
2c910 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c920 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
2c930 20 69 66 28 20 28 70 45 78 70 72 2d 3e 70 4c 65   if( (pExpr->pLe
2c940 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
2c950 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70  N && IsVirtual(p
2c960 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 79 2e 70  Expr->pLeft->y.p
2c970 54 61 62 29 29 0a 20 20 20 20 20 20 20 7c 7c 20  Tab)).       || 
2c980 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
2c990 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
2c9a0 20 49 73 56 69 72 74 75 61 6c 28 70 45 78 70 72   IsVirtual(pExpr
2c9b0 2d 3e 70 52 69 67 68 74 2d 3e 79 2e 70 54 61 62  ->pRight->y.pTab
2c9c0 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  )).      ){.    
2c9d0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2c9e0 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  une;.      }..  
2c9f0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
2ca00 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2ca10 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  inue;.  }.}../*.
2ca20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28  ** Return true (
2ca30 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 65 78 70  non-zero) if exp
2ca40 72 65 73 73 69 6f 6e 20 70 20 63 61 6e 20 6f 6e  ression p can on
2ca50 6c 79 20 62 65 20 74 72 75 65 20 69 66 20 61 74  ly be true if at
2ca60 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f   least.** one co
2ca70 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 54  lumn of table iT
2ca80 61 62 20 69 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20  ab is non-null. 
2ca90 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2caa0 20 72 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20   return true.** 
2cab0 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  if expression p 
2cac0 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 4e  will always be N
2cad0 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20 69 66 20  ULL or false if 
2cae0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  every column of 
2caf0 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e  iTab.** is NULL.
2cb00 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 6e 65 67  .**.** False neg
2cb10 61 74 69 76 65 73 20 61 72 65 20 61 63 63 65 70  atives are accep
2cb20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
2cb30 20 77 6f 72 64 73 2c 20 69 74 20 69 73 20 6f 6b   words, it is ok
2cb40 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65   to return.** ze
2cb50 72 6f 20 65 76 65 6e 20 69 66 20 65 78 70 72 65  ro even if expre
2cb60 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 6e 65 76  ssion p will nev
2cb70 65 72 20 62 65 20 74 72 75 65 20 6f 66 20 65 76  er be true of ev
2cb80 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54  ery column of iT
2cb90 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 20 20  ab.** is NULL.  
2cba0 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
2cbb0 20 69 73 20 6d 65 72 65 6c 79 20 61 20 6d 69 73   is merely a mis
2cbc0 73 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  sed optimization
2cbd0 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2a   opportunity..**
2cbe0 0a 2a 2a 20 46 61 6c 73 65 20 70 6f 73 69 74 69  .** False positi
2cbf0 76 65 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ves are not allo
2cc00 77 65 64 2c 20 68 6f 77 65 76 65 72 2e 20 20 41  wed, however.  A
2cc10 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 20   false positive 
2cc20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
2cc30 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e   an incorrect an
2cc40 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  swer..**.** Term
2cc50 73 20 6f 66 20 70 20 74 68 61 74 20 61 72 65 20  s of p that are 
2cc60 6d 61 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46  marked with EP_F
2cc70 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64 20 68 65 6e  romJoin (and hen
2cc80 63 65 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f  ce that come fro
2cc90 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55  m.** the ON or U
2cca0 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
2ccb0 4c 45 46 54 20 4a 4f 49 4e 53 29 20 61 72 65 20  LEFT JOINS) are 
2ccc0 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
2ccd0 65 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a  e analysis..**.*
2cce0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2ccf0 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
2cd00 69 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  if a LEFT JOIN c
2cd10 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  an be converted 
2cd20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e  into.** an ordin
2cd30 61 72 79 20 4a 4f 49 4e 2e 20 20 54 68 65 20 70  ary JOIN.  The p
2cd40 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2cd50 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2cd60 49 66 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  If the WHERE.** 
2cd70 63 6c 61 75 73 65 20 72 65 71 75 69 72 65 73 20  clause requires 
2cd80 74 68 61 74 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e  that some column
2cd90 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
2cda0 62 6c 65 20 6f 66 20 74 68 65 20 4c 45 46 54 20  ble of the LEFT 
2cdb0 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e  JOIN.** be non-N
2cdc0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4c 45  ULL, then the LE
2cdd0 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 73  FT JOIN can be s
2cde0 61 66 65 6c 79 20 63 6f 6e 76 65 72 74 65 64 20  afely converted 
2cdf0 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e  into an.** ordin
2ce00 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74  ary join..*/.int
2ce10 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2ce20 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78  iesNonNullRow(Ex
2ce30 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 29  pr *p, int iTab)
2ce40 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2ce50 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
2ce60 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b  kipCollateAndLik
2ce70 65 6c 79 28 70 29 3b 0a 20 20 77 68 69 6c 65 28  ely(p);.  while(
2ce80 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
2ce90 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op==TK_NOTNULL 
2cea0 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  ){.      p = p->
2ceb0 70 4c 65 66 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pLeft;.    }else
2cec0 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41   if( p->op==TK_A
2ced0 4e 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ND ){.      if( 
2cee0 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2cef0 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d 3e  esNonNullRow(p->
2cf00 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72  pLeft, iTab) ) r
2cf10 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70  eturn 1;.      p
2cf20 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
2cf30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
2cf40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2cf50 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2cf60 6b 20 3d 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75  k = impliesNotNu
2cf70 6c 6c 52 6f 77 3b 0a 20 20 77 2e 78 53 65 6c 65  llRow;.  w.xSele
2cf80 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ctCallback = 0;.
2cf90 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2cfa0 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 65 43  ack2 = 0;.  w.eC
2cfb0 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 69  ode = 0;.  w.u.i
2cfc0 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 73 71  Cur = iTab;.  sq
2cfd0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
2cfe0 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
2cff0 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
2d000 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2d010 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2d020 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
2d030 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  by the tree walk
2d040 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  er.** to determi
2d050 6e 65 20 69 66 20 61 6e 20 65 78 70 72 65 73 73  ne if an express
2d060 69 6f 6e 20 63 61 6e 20 62 65 20 65 76 61 6c 75  ion can be evalu
2d070 61 74 65 64 20 62 79 20 72 65 66 65 72 65 6e 63  ated by referenc
2d080 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65  e to the.** inde
2d090 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20  x only, without 
2d0a0 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 20 73  having to do a s
2d0b0 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 63 6f  earch for the co
2d0c0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
2d0d0 61 62 6c 65 20 65 6e 74 72 79 2e 20 20 54 68 65  able entry.  The
2d0e0 20 49 64 78 43 6f 76 65 72 2e 70 49 64 78 20 66   IdxCover.pIdx f
2d0f0 69 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64 65  ield is the inde
2d100 78 2e 20 20 49 64 78 43 6f 76 65 72 2e 69 43 75  x.  IdxCover.iCu
2d110 72 0a 2a 2a 20 69 73 20 74 68 65 20 63 75 72 73  r.** is the curs
2d120 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
2d130 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 43  ..*/.struct IdxC
2d140 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a  over {.  Index *
2d150 70 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65  pIdx;     /* The
2d160 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73   index to be tes
2d170 74 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65  ted for coverage
2d180 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
2d190 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
2d1a0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2d1b0 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
2d1c0 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
2d1d0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68   */.};../*.** Ch
2d1e0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
2d1f0 65 72 65 20 61 72 65 20 72 65 66 65 72 65 6e 63  ere are referenc
2d200 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
2d210 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b   table .** pWalk
2d220 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
2d230 3e 69 43 75 72 20 63 61 6e 20 62 65 20 73 61 74  >iCur can be sat
2d240 69 73 66 69 65 64 20 75 73 69 6e 67 20 74 68 65  isfied using the
2d250 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65   index.** pWalke
2d260 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
2d270 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
2d280 69 6e 74 20 65 78 70 72 49 64 78 43 6f 76 65 72  int exprIdxCover
2d290 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2d2a0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2d2b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
2d2c0 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26  =TK_COLUMN.   &&
2d2d0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
2d2e0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2d2f0 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20 20 26 26  over->iCur.   &&
2d300 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
2d310 49 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75  Index(pWalker->u
2d320 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78  .pIdxCover->pIdx
2d330 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
2d340 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61  )<0.  ){.    pWa
2d350 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b  lker->eCode = 1;
2d360 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
2d370 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Abort;.  }.  ret
2d380 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2d390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
2d3a0 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e 64 65 78  mine if an index
2d3b0 20 70 49 64 78 20 6f 6e 20 74 61 62 6c 65 20 77   pIdx on table w
2d3c0 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72 20  ith cursor iCur 
2d3d0 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a  contains will.**
2d3e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2d3f0 70 45 78 70 72 2e 20 20 52 65 74 75 72 6e 20 74  pExpr.  Return t
2d400 72 75 65 20 69 66 20 74 68 65 20 69 6e 64 65 78  rue if the index
2d410 20 64 6f 65 73 20 63 6f 76 65 72 20 74 68 65 0a   does cover the.
2d420 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
2d430 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 70  d false if the p
2d440 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20  Expr expression 
2d450 72 65 66 65 72 65 6e 63 65 73 20 74 61 62 6c 65  references table
2d460 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74   columns.** that
2d470 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69   are not found i
2d480 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78  n the index pIdx
2d490 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78  ..**.** An index
2d4a0 20 63 6f 76 65 72 69 6e 67 20 61 6e 20 65 78 70   covering an exp
2d4b0 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68  ression means th
2d4c0 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
2d4d0 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c  n can be.** eval
2d4e0 75 61 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79  uated using only
2d4f0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 77   the index and w
2d500 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
2d510 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63   lookup the.** c
2d520 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
2d530 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74  le entry..*/.int
2d540 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65   sqlite3ExprCove
2d550 72 65 64 42 79 49 6e 64 65 78 28 0a 20 20 45 78  redByIndex(.  Ex
2d560 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
2d570 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
2d580 6f 20 62 65 20 74 65 73 74 65 64 20 2a 2f 0a 20  o be tested */. 
2d590 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
2d5a0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
2d5b0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
2d5c0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2d5d0 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78  table */.  Index
2d5e0 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
2d5f0 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74  * The index that
2d600 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 66   might be used f
2d610 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29  or coverage */.)
2d620 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2d630 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20  struct IdxCover 
2d640 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26  xcov;.  memset(&
2d650 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
2d660 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72 20 3d 20  ;.  xcov.iCur = 
2d670 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64  iCur;.  xcov.pId
2d680 78 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78 45  x = pIdx;.  w.xE
2d690 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
2d6a0 70 72 49 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e  prIdxCover;.  w.
2d6b0 75 2e 70 49 64 78 43 6f 76 65 72 20 3d 20 26 78  u.pIdxCover = &x
2d6c0 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  cov;.  sqlite3Wa
2d6d0 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
2d6e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e 65  );.  return !w.e
2d6f0 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Code;.}.../*.** 
2d700 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
2d710 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2d720 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62  ucture is used b
2d730 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65  y the tree walke
2d740 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65  r.** to count re
2d750 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c  ferences to tabl
2d760 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
2d770 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e   arguments of an
2d780 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66   .** aggregate f
2d790 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65  unction, in orde
2d7a0 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  r to implement t
2d7b0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e  he.** sqlite3Fun
2d7c0 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72  ctionThisSrc() r
2d7d0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
2d7e0 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53  t SrcCount {.  S
2d7f0 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
2d800 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61  /* One particula
2d810 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  r FROM clause in
2d820 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79 20   a nested query 
2d830 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20  */.  int nThis; 
2d840 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d850 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2d860 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63   columns in pSrc
2d870 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  List */.  int nO
2d880 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75  ther;      /* Nu
2d890 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2d8a0 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
2d8b0 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
2d8c0 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ses */.};../*.**
2d8d0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
2d8e0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2d8f0 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73  to columns..*/.s
2d900 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 72  tatic int exprSr
2d910 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70  cCount(Walker *p
2d920 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2d930 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e  xpr){.  /* The N
2d940 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65  EVER() on the se
2d950 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63  cond term is bec
2d960 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63  ause sqlite3Func
2d970 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2d980 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  ).  ** is always
2d990 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73   called before s
2d9a0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2d9b0 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61 6e  eAggregates() an
2d9c0 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b  d so the.  ** TK
2d9d0 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f  _COLUMNs have no
2d9e0 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65  t yet been conve
2d9f0 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47  rted into TK_AGG
2da00 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a  _COLUMN.  If.  *
2da10 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
2da20 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20 69  nUsesThisSrc() i
2da30 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e 74  s used different
2da40 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  ly in the future
2da50 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52  , the.  ** NEVER
2da60 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  () will need to 
2da70 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20  be removed. */. 
2da80 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
2da90 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56  TK_COLUMN || NEV
2daa0 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  ER(pExpr->op==TK
2dab0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a  _AGG_COLUMN) ){.
2dac0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
2dad0 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a  truct SrcCount *
2dae0 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
2daf0 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72  SrcCount;.    Sr
2db00 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
2db10 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e  >pSrc;.    int n
2db20 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72  Src = pSrc ? pSr
2db30 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20  c->nSrc : 0;.   
2db40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63   for(i=0; i<nSrc
2db50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2db60 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
2db70 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  =pSrc->a[i].iCur
2db80 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
2db90 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72   }.    if( i<nSr
2dba0 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54  c ){.      p->nT
2dbb0 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  his++;.    }else
2dbc0 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 7c 7c 20   if( nSrc==0 || 
2dbd0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 70 53  pExpr->iTable<pS
2dbe0 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
2dbf0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
2dc00 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 70 61  a well-formed pa
2dc10 72 73 65 20 74 72 65 65 20 28 6e 6f 20 6e 61 6d  rse tree (no nam
2dc20 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 65 72 72  e resolution err
2dc30 6f 72 73 29 2c 0a 20 20 20 20 20 20 2f 2a 20 54  ors),.      /* T
2dc40 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 77  K_COLUMN nodes w
2dc50 69 74 68 20 73 6d 61 6c 6c 65 72 20 45 78 70 72  ith smaller Expr
2dc60 2e 69 54 61 62 6c 65 20 76 61 6c 75 65 73 20 61  .iTable values a
2dc70 72 65 20 69 6e 20 61 6e 0a 20 20 20 20 20 20 2a  re in an.      *
2dc80 2a 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 2e  * outer context.
2dc90 20 20 54 68 6f 73 65 20 61 72 65 20 74 68 65 20    Those are the 
2dca0 6f 6e 6c 79 20 6f 6e 65 73 20 74 6f 20 63 6f 75  only ones to cou
2dcb0 6e 74 20 61 73 20 22 6f 74 68 65 72 22 20 2a 2f  nt as "other" */
2dcc0 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72  .      p->nOther
2dcd0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
2dce0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2dcf0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  nue;.}../*.** De
2dd00 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f  termine if any o
2dd10 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  f the arguments 
2dd20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46 75 6e  to the pExpr Fun
2dd30 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a  ction reference.
2dd40 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65  ** pSrcList.  Re
2dd50 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
2dd60 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75  y do.  Also retu
2dd70 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66  rn true if the f
2dd80 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e  unction.** has n
2dd90 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68  o arguments or h
2dda0 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  as only constant
2ddb0 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
2ddc0 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78  urn false if pEx
2ddd0 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  pr.** references
2dde0 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74   columns but not
2ddf0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c   columns of tabl
2de00 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63  es found in pSrc
2de10 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  List..*/.int sql
2de20 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
2de30 54 68 69 73 53 72 63 28 45 78 70 72 20 2a 70 45  ThisSrc(Expr *pE
2de40 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53  xpr, SrcList *pS
2de50 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65  rcList){.  Walke
2de60 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72  r w;.  struct Sr
2de70 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73  cCount cnt;.  as
2de80 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
2de90 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2dea0 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   );.  memset(&w,
2deb0 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
2dec0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2ded0 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74  k = exprSrcCount
2dee0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2def0 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53  lback = sqlite3S
2df00 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  electWalkNoop;. 
2df10 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d   w.u.pSrcCount =
2df20 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72   &cnt;.  cnt.pSr
2df30 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20  c = pSrcList;.  
2df40 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20  cnt.nThis = 0;. 
2df50 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b   cnt.nOther = 0;
2df60 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2df70 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72  prList(&w, pExpr
2df80 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65  ->x.pList);.  re
2df90 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30  turn cnt.nThis>0
2dfa0 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d   || cnt.nOther==
2dfb0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
2dfc0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
2dfd0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
2dfe0 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
2dff0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
2e000 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
2e010 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
2e020 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
2e030 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
2e040 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2e050 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
2e060 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
2e070 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
2e080 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
2e090 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72  aCol = sqlite3Ar
2e0a0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
2e0b0 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70      db,.       p
2e0c0 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20  Info->aCol,.    
2e0d0 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
2e0e0 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20  >aCol[0]),.     
2e0f0 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d    &pInfo->nColum
2e100 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  n,.       &i.  )
2e110 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
2e120 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61     ../*.** Add a
2e130 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
2e140 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  the pAggInfo->aF
2e150 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  unc[] array.  Re
2e160 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
2e170 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
2e180 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
2e190 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
2e1a0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
2e1b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2e1c0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71  ddAggInfoFunc(sq
2e1d0 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
2e1e0 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
2e1f0 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46  t i;.  pInfo->aF
2e200 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72  unc = sqlite3Arr
2e210 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
2e220 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70     db, .       p
2e230 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20  Info->aFunc,.   
2e240 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
2e250 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20  ->aFunc[0]),.   
2e260 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
2e270 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
2e280 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
2e290 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
2e2a0 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c  is the xExprCall
2e2b0 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20  back for a tree 
2e2c0 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75  walker.  It is u
2e2d0 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  sed to.** implem
2e2e0 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  ent sqlite3ExprA
2e2f0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2e300 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
2e310 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2e320 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
2e330 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
2e340 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2e350 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
2e360 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ate(Walker *pWal
2e370 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2e380 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  ){.  int i;.  Na
2e390 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
2e3a0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
2e3b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2e3c0 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
2e3d0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
2e3e0 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
2e3f0 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a  ist;.  AggInfo *
2e400 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e  pAggInfo = pNC->
2e410 75 4e 43 2e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20  uNC.pAggInfo;.. 
2e420 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 63   assert( pNC->nc
2e430 46 6c 61 67 73 20 26 20 4e 43 5f 55 41 67 67 49  Flags & NC_UAggI
2e440 6e 66 6f 20 29 3b 0a 20 20 73 77 69 74 63 68 28  nfo );.  switch(
2e450 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
2e460 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
2e470 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
2e480 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
2e490 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2e4a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
2e4b0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
2e4c0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2e4d0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
2e4e0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2e4f0 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
2e500 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66  umn is in one of
2e510 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
2e520 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a  he FROM.      **
2e530 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
2e540 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
2e550 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  /.      if( ALWA
2e560 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20  YS(pSrcList!=0) 
2e570 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
2e580 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2e590 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74  pItem = pSrcList
2e5a0 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ->a;.        for
2e5b0 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74  (i=0; i<pSrcList
2e5c0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
2e5d0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
2e5e0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2e5f0 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  col *pCol;.     
2e600 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2e610 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2e620 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
2e630 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
2e640 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2e650 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
2e660 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a  tem->iCursor ){.
2e670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2e680 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
2e690 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
2e6a0 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72  that pExpr refer
2e6b0 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20  s to a table.   
2e6c0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
2e6d0 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20   is in the FROM 
2e6e0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
2e6f0 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20  gregate query.  
2e700 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  .            **.
2e710 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d              ** M
2e720 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ake an entry for
2e730 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70   the column in p
2e740 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
2e750 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  if there.       
2e760 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
2e770 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c  n entry there al
2e780 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20  ready..         
2e790 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2e7a0 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
2e7b0 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67       pCol = pAgg
2e7c0 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  Info->aCol;.    
2e7d0 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
2e7e0 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   k<pAggInfo->nCo
2e7f0 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b  lumn; k++, pCol+
2e800 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2e810 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62    if( pCol->iTab
2e820 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
2e830 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
2e840 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
2e850 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
2e860 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
2e870 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2e880 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2e890 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e8a0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e           if( (k>
2e8b0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  =pAggInfo->nColu
2e8c0 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn).            
2e8d0 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49   && (k = addAggI
2e8e0 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  nfoColumn(pParse
2e8f0 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29  ->db, pAggInfo))
2e900 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  >=0 .           
2e910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e920 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e    pCol = &pAggIn
2e930 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20  fo->aCol[k];.   
2e940 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2e950 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 79  >pTab = pExpr->y
2e960 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
2e970 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c       pCol->iTabl
2e980 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  e = pExpr->iTabl
2e990 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2e9a0 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pCol->iColumn =
2e9b0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
2e9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2e9d0 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  Col->iMem = ++pP
2e9e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2e9f0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2ea00 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
2ea10 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
2ea20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20    pCol->pExpr = 
2ea30 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
2ea40 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66       if( pAggInf
2ea50 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  o->pGroupBy ){. 
2ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2ea70 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20  nt j, n;.       
2ea80 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73           ExprLis
2ea90 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66  t *pGB = pAggInf
2eaa0 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  o->pGroupBy;.   
2eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
2eac0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2ead0 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e  m *pTerm = pGB->
2eae0 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a;.             
2eaf0 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70     n = pGB->nExp
2eb00 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
2eb10 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
2eb20 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
2eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb40 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65    Expr *pE = pTe
2eb50 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
2eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2eb70 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pE->op==TK_COLU
2eb80 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65  MN && pE->iTable
2eb90 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
2eba0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
2ebb0 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f           pE->iCo
2ebc0 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
2ebd0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
2ebe0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2ebf0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
2ec00 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
2ec10 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2ec40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ec50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ec60 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
2ec70 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b  orterColumn<0 ){
2ec80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ec90 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2eca0 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d  lumn = pAggInfo-
2ecb0 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b  >nSortingColumn+
2ecc0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
2ecd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2ece0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2ecf0 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20  There is now an 
2ed00 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20  entry for pExpr 
2ed10 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
2ed20 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20  l[] (either.    
2ed30 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75          ** becau
2ed40 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20  se it was there 
2ed50 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73  before or becaus
2ed60 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65  e we just create
2ed70 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20  d it)..         
2ed80 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68     ** Convert th
2ed90 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20  e pExpr to be a 
2eda0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65  TK_AGG_COLUMN re
2edb0 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a  ferring to that.
2edc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
2edd0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
2ede0 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20  entry..         
2edf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2ee00 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2ee10 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
2ee20 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
2ee30 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
2ee40 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
2ee50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
2ee60 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
2ee70 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
2ee80 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
2ee90 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20   = (i16)k;.     
2eea0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2eeb0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
2eec0 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
2eed0 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
2eee0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
2eef0 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
2ef00 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
2ef10 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
2ef20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
2ef30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
2ef40 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
2ef50 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
2ef60 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46  lags & NC_InAggF
2ef70 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  unc)==0.       &
2ef80 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65  & pWalker->walke
2ef90 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f  rDepth==pExpr->o
2efa0 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  p2.      ){.    
2efb0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
2efc0 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20  see if pExpr is 
2efd0 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
2efe0 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65  nother aggregate
2eff0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e   .        ** fun
2f000 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c  ction that is al
2f010 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67  ready in the pAg
2f020 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  gInfo structure.
2f030 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f040 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
2f050 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20  o_func *pItem = 
2f060 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
2f070 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2f080 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2f090 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  unc; i++, pItem+
2f0a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2f0b0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2f0c0 70 61 72 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70  pare(0, pItem->p
2f0d0 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29  Expr, pExpr, -1)
2f0e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2f0f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2f100 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2f110 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
2f120 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
2f130 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
2f140 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
2f150 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
2f160 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
2f170 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
2f180 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2f190 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
2f1a0 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
2f1b0 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
2f1c0 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64  foFunc(pParse->d
2f1d0 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  b, pAggInfo);.  
2f1e0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
2f1f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f200 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2f210 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2f220 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2f230 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2f240 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
2f250 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
2f260 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
2f270 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
2f280 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
2f290 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
2f2a0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
2f2b0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2f2c0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2f2d0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
2f2e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2f2f0 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
2f300 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
2f310 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
2f320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f330 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
2f340 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2f350 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c       pExpr->x.pL
2f360 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ist ? pExpr->x.p
2f370 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
2f380 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
2f390 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2f3a0 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
2f3b0 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
2f3c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
2f3d0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
2f3e0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
2f3f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f400 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2f410 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
2f420 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2f430 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f440 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
2f450 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
2f460 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
2f470 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
2f480 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
2f490 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
2f4a0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2f4b0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2f4c0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
2f4d0 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
2f4e0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2f4f0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2f500 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
2f510 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
2f520 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
2f530 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
2f540 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
2f550 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2f560 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Prune;.      }el
2f570 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
2f580 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2f590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f5a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
2f5b0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
2f5c0 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
2f5d0 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
2f5e0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2f5f0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2f600 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2f610 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
2f620 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  .  pWalker->walk
2f630 65 72 44 65 70 74 68 2b 2b 3b 0a 20 20 72 65 74  erDepth++;.  ret
2f640 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2f650 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2f660 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2f670 73 49 6e 53 65 6c 65 63 74 45 6e 64 28 57 61 6c  sInSelectEnd(Wal
2f680 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2f690 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2f6a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2f6b0 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  ER(pSelect);.  p
2f6c0 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
2f6d0 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pth--;.}../*.** 
2f6e0 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70  Analyze the pExp
2f6f0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f  r expression loo
2f700 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  king for aggrega
2f710 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
2f720 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65  .** for variable
2f730 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
2f740 65 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e  e added to AggIn
2f750 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70  fo object that p
2f760 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20  NC->pAggInfo.** 
2f770 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69  points to.  Addi
2f780 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61  tional entries a
2f790 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41  re made on the A
2f7a0 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73  ggInfo object as
2f7b0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a  .** necessary..*
2f7c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2f7d0 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
2f7e0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
2f7f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
2f800 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
2f810 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f  d by sqlite3Reso
2f820 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a  lveExprNames()..
2f830 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2f840 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2f850 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74  ates(NameContext
2f860 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78   *pNC, Expr *pEx
2f870 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  pr){.  Walker w;
2f880 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2f890 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
2f8a0 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65  egate;.  w.xSele
2f8b0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  ctCallback = ana
2f8c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
2f8d0 53 65 6c 65 63 74 3b 0a 20 20 77 2e 78 53 65 6c  Select;.  w.xSel
2f8e0 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 61  ectCallback2 = a
2f8f0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2f900 49 6e 53 65 6c 65 63 74 45 6e 64 3b 0a 20 20 77  InSelectEnd;.  w
2f910 2e 77 61 6c 6b 65 72 44 65 70 74 68 20 3d 20 30  .walkerDepth = 0
2f920 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
2f930 43 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  C;.  w.pParse = 
2f940 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  0;.  assert( pNC
2f950 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
2f960 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2f970 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
2f980 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
2f990 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2f9a0 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
2f9b0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
2f9c0 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
2f9d0 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
2f9e0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2f9f0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
2fa00 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
2fa10 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
2fa20 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
2fa30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2fa40 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2fa50 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  t(NameContext *p
2fa60 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  NC, ExprList *pL
2fa70 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45  ist){.  struct E
2fa80 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
2fa90 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
2faa0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
2fab0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
2fac0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
2fad0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
2fae0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
2faf0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2fb00 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
2fb10 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
2fb20 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2fb30 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69  ** Allocate a si
2fb40 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65  ngle new registe
2fb50 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c  r for use to hol
2fb60 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69  d some intermedi
2fb70 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69  ate result..*/.i
2fb80 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2fb90 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
2fba0 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
2fbb0 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29  e->nTempReg==0 )
2fbc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70  {.    return ++p
2fbd0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
2fbe0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
2fbf0 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61  ->aTempReg[--pPa
2fc00 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a  rse->nTempReg];.
2fc10 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
2fc20 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20  ate a register, 
2fc30 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65  making available
2fc40 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73   for reuse for s
2fc50 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72  ome other.** pur
2fc60 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pose..*/.void sq
2fc70 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2fc80 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
2fc90 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
2fca0 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72  if( iReg && pPar
2fcb0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
2fcc0 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
2fcd0 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
2fce0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2fcf0 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
2fd00 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d  g++] = iReg;.  }
2fd10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2fd20 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
2fd30 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67   a block of nReg
2fd40 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
2fd50 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  isters..*/.int s
2fd60 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
2fd70 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2fd80 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
2fd90 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e  nt i, n;.  if( n
2fda0 52 65 67 3d 3d 31 20 29 20 72 65 74 75 72 6e 20  Reg==1 ) return 
2fdb0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2fdc0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 20 3d  g(pParse);.  i =
2fdd0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2fde0 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65  eg;.  n = pParse
2fdf0 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69  ->nRangeReg;.  i
2fe00 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20  f( nReg<=n ){.  
2fe10 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
2fe20 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
2fe30 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2fe40 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
2fe50 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
2fe60 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
2fe70 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2fe80 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
2fe90 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
2fea0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2feb0 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
2fec0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
2fed0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20  nt nReg){.  if( 
2fee0 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73  nReg==1 ){.    s
2fef0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2ff00 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65  pReg(pParse, iRe
2ff10 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  g);.    return;.
2ff20 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 67 3e 70    }.  if( nReg>p
2ff30 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2ff40 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
2ff50 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67  nRangeReg = nReg
2ff60 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
2ff70 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a  angeReg = iReg;.
2ff80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
2ff90 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  k all temporary 
2ffa0 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69  registers as bei
2ffb0 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66  ng unavailable f
2ffc0 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69  or reuse..*/.voi
2ffd0 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65  d sqlite3ClearTe
2ffe0 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65  mpRegCache(Parse
2fff0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
30000 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20  rse->nTempReg = 
30010 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  0;.  pParse->nRa
30020 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f  ngeReg = 0;.}../
30030 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68  *.** Validate th
30040 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20  at no temporary 
30050 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77  register falls w
30060 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
30070 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c  of.** iFirst..iL
30080 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20  ast, inclusive. 
30090 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
300a0 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20   only call from 
300b0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a  within assert().
300c0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  ** statements..*
300d0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
300e0 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
300f0 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28  3NoTempsInRange(
30100 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
30110 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69  nt iFirst, int i
30120 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Last){.  int i;.
30130 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52    if( pParse->nR
30140 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20  angeReg>0.   && 
30150 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
30160 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g+pParse->nRange
30170 52 65 67 20 3e 20 69 46 69 72 73 74 0a 20 20 20  Reg > iFirst.   
30180 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67  && pParse->iRang
30190 65 52 65 67 20 3c 3d 20 69 4c 61 73 74 0a 20 20  eReg <= iLast.  
301a0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
301b0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
301c0 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70   i<pParse->nTemp
301d0 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Reg; i++){.    i
301e0 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  f( pParse->aTemp
301f0 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26  Reg[i]>=iFirst &
30200 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  & pParse->aTempR
30210 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a  eg[i]<=iLast ){.
30220 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
30230 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
30240 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
30250 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
30260 2f 0a                                            /.