/ Hex Artifact Content
Login

Artifact 18974550063a6a1c8eef69e63d2ad88ceb4395ef139a60cc0d0a28632f41d553:


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 28 64 62  n sqlite3Expr(db
7530: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 22 30  , TK_INTEGER, "0
7540: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
7550: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
7560: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
7570: 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  AND, pLeft, pRig
7580: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
7590: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
75a0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
75b0: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
75c0: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
75d0: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
75e0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
75f0: 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20 50 61 72  rFunction(.  Par
7600: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7610: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
7620: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
7630: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
7640: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6c 69 73   /* Argument lis
7650: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
7660: 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  oken,        /* 
7670: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63  Name of the func
7680: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 44  tion */.  int eD
7690: 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 20 20  istinct         
76a0: 2f 2a 20 53 46 5f 44 69 73 74 69 6e 63 74 20 6f  /* SF_Distinct o
76b0: 72 20 53 46 5f 41 4c 4c 20 6f 72 20 30 20 2a 2f  r SF_ALL or 0 */
76c0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
76d0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
76e0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
76f0: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
7700: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
7710: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
7720: 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f  TK_FUNCTION, pTo
7730: 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ken, 1);.  if( p
7740: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
7750: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
7760: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
7770: 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20  /* Avoid memory 
7780: 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  leak when malloc
7790: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
77a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
77b0: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
77c0: 2d 3e 6e 45 78 70 72 20 3e 20 70 50 61 72 73 65  ->nExpr > pParse
77d0: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
77e0: 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
77f0: 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20 20 20 20 73  ON_ARG] ){.    s
7800: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7810: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
7820: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75   arguments on fu
7830: 6e 63 74 69 6f 6e 20 25 54 22 2c 20 70 54 6f 6b  nction %T", pTok
7840: 65 6e 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  en);.  }.  pNew-
7850: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
7860: 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  ;.  ExprSetPrope
7870: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 48 61 73  rty(pNew, EP_Has
7880: 46 75 6e 63 29 3b 0a 20 20 61 73 73 65 72 74 28  Func);.  assert(
7890: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
78a0: 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65  y(pNew, EP_xIsSe
78b0: 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  lect) );.  sqlit
78c0: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
78d0: 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20  ndFlags(pParse, 
78e0: 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 65 44 69  pNew);.  if( eDi
78f0: 73 74 69 6e 63 74 3d 3d 53 46 5f 44 69 73 74 69  stinct==SF_Disti
7900: 6e 63 74 20 29 20 45 78 70 72 53 65 74 50 72 6f  nct ) ExprSetPro
7910: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 44  perty(pNew, EP_D
7920: 69 73 74 69 6e 63 74 29 3b 0a 20 20 72 65 74 75  istinct);.  retu
7930: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
7940: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
7950: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
7960: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
7970: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
7980: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
7990: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
79a0: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
79b0: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
79c0: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
79d0: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
79e0: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
79f0: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
7a00: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
7a10: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
7a20: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
7a30: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
7a40: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
7a50: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
7a60: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20   is not too big 
7a70: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
7a80: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
7a90: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
7aa0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
7ab0: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
7ac0: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
7ad0: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7ae0: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c  the form ":aaa",
7af0: 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61   "@aaa", or "$aa
7b00: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
7b10: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
7b20: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
7b30: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
7b40: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
7b50: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
7b60: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
7b70: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
7b80: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
7b90: 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69   sequential vari
7ba0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
7bb0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
7bc0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
7bd0: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
7be0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
7bf0: 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e  pr *pExpr, u32 n
7c00: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7c10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7c20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7c30: 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66    ynVar x;..  if
7c40: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
7c50: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21  urn;.  assert( !
7c60: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7c70: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
7c80: 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50  ue|EP_Reduced|EP
7c90: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20  _TokenOnly) );. 
7ca0: 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54   z = pExpr->u.zT
7cb0: 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
7cc0: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
7cd0: 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61  ( z[0]!=0 );.  a
7ce0: 73 73 65 72 74 28 20 6e 3d 3d 28 75 33 32 29 73  ssert( n==(u32)s
7cf0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7d00: 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  ) );.  if( z[1]=
7d10: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
7d20: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
7d30: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
7d40: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
7d50: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
7d60: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
7d70: 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79 6e 56   );.    x = (ynV
7d80: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
7d90: 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ar);.  }else{.  
7da0: 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20 30 3b    int doAdd = 0;
7db0: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
7dc0: 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  ?' ){.      /* W
7dd0: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
7de0: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
7df0: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
7e00: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
7e10: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
7e20: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
7e30: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ber */.      i64
7e40: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   i;.      int bO
7e50: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  k;.      if( n==
7e60: 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  2 ){ /*OPTIMIZAT
7e70: 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20  ION-IF-TRUE*/.  
7e80: 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d 2d 27        i = z[1]-'
7e90: 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  0';  /* The comm
7ea0: 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20 66 6f  on case of ?N fo
7eb0: 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67 69 74  r a single digit
7ec0: 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f   N */.        bO
7ed0: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  k = 1;.      }el
7ee0: 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20  se{.        bOk 
7ef0: 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  = 0==sqlite3Atoi
7f00: 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d  64(&z[1], &i, n-
7f10: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  1, SQLITE_UTF8);
7f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
7f30: 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b  estcase( i==0 );
7f40: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7f50: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74   i==1 );.      t
7f60: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
7f70: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7f80: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7f90: 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20  BER]-1 );.      
7fa0: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
7fb0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7fc0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7fd0: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69  MBER] );.      i
7fe0: 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31  f( bOk==0 || i<1
7ff0: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
8000: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8010: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
8020: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8030: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8040: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
8050: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
8060: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
8070: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
8080: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8090: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
80a0: 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  BER]);.        r
80b0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
80c0: 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29       x = (ynVar)
80d0: 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  i;.      if( x>p
80e0: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
80f0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
8100: 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20 20  Var = (int)x;.  
8110: 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b        doAdd = 1;
8120: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8130: 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d   sqlite3VListNum
8140: 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70  ToName(pParse->p
8150: 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b 0a  VList, x)==0 ){.
8160: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
8170: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
8180: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
8190: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
81a0: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
81b0: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
81c0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
81d0: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
81e0: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
81f0: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
8200: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
8210: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
8220: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
8230: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
8240: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
8250: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
8260: 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20     */.      x = 
8270: 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33 56 4c  (ynVar)sqlite3VL
8280: 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50 61  istNameToNum(pPa
8290: 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20  rse->pVList, z, 
82a0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3d  n);.      if( x=
82b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20  =0 ){.        x 
82c0: 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72  = (ynVar)(++pPar
82d0: 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20  se->nVar);.     
82e0: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
82f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8300: 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20 20 20  if( doAdd ){.   
8310: 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73     pParse->pVLis
8320: 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74  t = sqlite3VList
8330: 41 64 64 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  Add(db, pParse->
8340: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78 29  pVList, z, n, x)
8350: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
8360: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78  xpr->iColumn = x
8370: 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e 61 4c  ;.  if( x>db->aL
8380: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8390: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
83a0: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
83b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
83c0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
83d0: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
83e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
83f0: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
8400: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
8410: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
8420: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
8430: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8440: 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eNN(sqlite3 *db,
8450: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73   Expr *p){.  ass
8460: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f  ert( p!=0 );.  /
8470: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
8480: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
8490: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
84a0: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
84b0: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
84c0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
84d0: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
84e0: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
84f0: 75 65 3e 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65  ue>=0 );..  asse
8500: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
8510: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
8520: 6e 63 29 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e  nc) || p->y.pWin
8530: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
8540: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73  cFailed );.  ass
8550: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46  ert( p->op!=TK_F
8560: 55 4e 43 54 49 4f 4e 20 7c 7c 20 45 78 70 72 48  UNCTION || ExprH
8570: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8580: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
8590: 64 75 63 65 64 29 0a 20 20 20 20 20 20 20 20 20  duced).         
85a0: 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e 3d 3d 30   || p->y.pWin==0
85b0: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
85c0: 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e  rty(p, EP_WinFun
85d0: 63 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  c) );.#ifdef SQL
85e0: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
85f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8600: 70 2c 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21  p, EP_Leaf) && !
8610: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8620: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
8630: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8640: 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20  p->pLeft==0 );. 
8650: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
8660: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ight==0 );.    a
8670: 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c  ssert( p->x.pSel
8680: 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  ect==0 );.  }.#e
8690: 6e 64 69 66 0a 20 20 69 66 28 20 21 45 78 70 72  ndif.  if( !Expr
86a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28  HasProperty(p, (
86b0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
86c0: 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a  Leaf)) ){.    /*
86d0: 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f   The Expr.x unio
86e0: 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  n is never used 
86f0: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
8700: 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20   as Expr.pRight 
8710: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
8720: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
8730: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
8740: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
8750: 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45   && p->op!=TK_SE
8760: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71  LECT_COLUMN ) sq
8770: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8780: 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  N(db, p->pLeft);
8790: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67  .    if( p->pRig
87a0: 68 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ht ){.      asse
87b0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
87c0: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
87d0: 6e 63 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  nc) );.      sql
87e0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e  ite3ExprDeleteNN
87f0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
8800: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 45  .    }else if( E
8810: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8820: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
8830: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
8840: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
8850: 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  y(p, EP_WinFunc)
8860: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
8870: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
8880: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  , p->x.pSelect);
8890: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
88a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
88b0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
88c0: 2e 70 4c 69 73 74 29 3b 0a 23 69 66 6e 64 65 66  .pList);.#ifndef
88d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
88e0: 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66  DOWFUNC.      if
88f0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8900: 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  y(p, EP_WinFunc)
8910: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8920: 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28  te3WindowDelete(
8930: 64 62 2c 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a  db, p->y.pWin);.
8940: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
8950: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 45     }.  }.  if( E
8960: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8970: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
8980: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8990: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
89a0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
89b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74  roperty(p, EP_St
89c0: 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c  atic) ){.    sql
89d0: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
89e0: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20   p);.  }.}.void 
89f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8a00: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
8a10: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
8a20: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65   ) sqlite3ExprDe
8a30: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  leteNN(db, p);.}
8a40: 0a 0a 2f 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69  ../* Invoke sqli
8a50: 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d  te3RenameExprUnm
8a60: 61 70 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ap() and sqlite3
8a70: 45 78 70 72 44 65 6c 65 74 65 28 29 20 6f 6e 20  ExprDelete() on 
8a80: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
8a90: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8aa0: 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64 44 65  e3ExprUnmapAndDe
8ab0: 6c 65 74 65 28 50 61 72 73 65 20 2a 70 50 61 72  lete(Parse *pPar
8ac0: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
8ad0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
8ae0: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
8af0: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
8b00: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
8b10: 70 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  p(pParse, p);.  
8b20: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
8b30: 78 70 72 44 65 6c 65 74 65 4e 4e 28 70 50 61 72  xprDeleteNN(pPar
8b40: 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  se->db, p);.  }.
8b50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8b60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
8b70: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
8b80: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
8b90: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
8ba0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
8bb0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
8bc0: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
8bd0: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
8be0: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
8bf0: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
8c00: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
8c10: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
8c20: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
8c30: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
8c40: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8c50: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
8c60: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
8c70: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
8c80: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8c90: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
8ca0: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
8cb0: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
8cc0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
8cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70  }../*.** The dup
8ce0: 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f  edExpr*Size() ro
8cf0: 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75  utines each retu
8d00: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
8d10: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a   bytes required.
8d20: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f  ** to store a co
8d30: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
8d40: 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f  ion or expressio
8d50: 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69  n tree.  They di
8d60: 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d  ffer in.** how m
8d70: 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  uch of the tree 
8d80: 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a  is measured..**.
8d90: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
8da0: 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20  StructSize()    
8db0: 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68   Size of only th
8dc0: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
8dd0: 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78   .**     dupedEx
8de0: 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20  prNodeSize()    
8df0: 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20     Size of Expr 
8e00: 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65  + space for toke
8e10: 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  n.**     dupedEx
8e20: 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20  prSize()        
8e30: 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20     Expr + token 
8e40: 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e  + subtree compon
8e50: 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ents.**.********
8e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e70: 2a 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 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75  ***.**.** The du
8eb0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
8ec0: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  e() function ret
8ed0: 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20  urns two values 
8ee0: 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20  OR-ed together: 
8ef0: 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61   .** (1) the spa
8f00: 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
8f10: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
8f20: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c  pr structure onl
8f30: 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68  y and .** (2) th
8f40: 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74  e EP_xxx flags t
8f50: 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61  hat indicate wha
8f60: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
8f70: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a  size should be..
8f80: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
8f90: 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f  lues is always o
8fa0: 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
8fb0: 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a    EXPR_FULLSIZE.
8fc0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44  **      EXPR_RED
8fd0: 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f  UCEDSIZE   | EP_
8fe0: 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20  Reduced.**      
8ff0: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
9000: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
9010: 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  y.**.** The size
9020: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
9030: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  e can be found b
9040: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65  y masking the re
9050: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66  turn value.** of
9060: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
9070: 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66  th 0xfff.  The f
9080: 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  lags can be foun
9090: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
90a0: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
90b0: 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64   with EP_Reduced
90c0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a  |EP_TokenOnly..*
90d0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
90e0: 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  ith flags==EXPRD
90f0: 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20  UP_REDUCE, this 
9100: 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f  routines works o
9110: 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28  n full-size.** (
9120: 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20  unreduced) Expr 
9130: 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20  objects as they 
9140: 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  or originally co
9150: 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
9160: 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69   parser..** Duri
9170: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ng expression an
9180: 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e  alysis, extra in
9190: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d  formation is com
91a0: 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20  puted and moved 
91b0: 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61  into.** later pa
91c0: 72 74 73 20 6f 66 20 74 68 65 20 45 78 70 72 20  rts of the Expr 
91d0: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
91e0: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
91f0: 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70  n might get chop
9200: 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68  ped.** off if th
9210: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9220: 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61  reduced.  Note a
9230: 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  lso that it does
9240: 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20   not work to.** 
9250: 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f  make an EXPRDUP_
9260: 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61  REDUCE copy of a
9270: 20 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73   reduced express
9280: 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ion.  It is only
9290: 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64   legal.** to red
92a0: 75 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65  uce a pristine e
92b0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66  xpression tree f
92c0: 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20  rom the parser. 
92d0: 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
92e0: 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45  ion.** of dupedE
92f0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
9300: 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65  contain multiple
9310: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
9320: 65 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70  ents that attemp
9330: 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20  t.** to enforce 
9340: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
9350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9360: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
9370: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
9380: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53  flags){.  int nS
9390: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ize;.  assert( f
93a0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
93b0: 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30  DUCE || flags==0
93c0: 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20   ); /* Only one 
93d0: 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77  flag value allow
93e0: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
93f0: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30  EXPR_FULLSIZE<=0
9400: 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74  xfff );.  assert
9410: 28 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52  ( (0xfff & (EP_R
9420: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
9430: 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66  nly))==0 );.  if
9440: 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20 70 2d  ( 0==flags || p-
9450: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op==TK_SELECT_C
9460: 4f 4c 55 4d 4e 20 0a 23 69 66 6e 64 65 66 20 53  OLUMN .#ifndef S
9470: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
9480: 57 46 55 4e 43 0a 20 20 20 7c 7c 20 45 78 70 72  WFUNC.   || Expr
9490: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
94a0: 50 5f 57 69 6e 46 75 6e 63 29 0a 23 65 6e 64 69  P_WinFunc).#endi
94b0: 66 0a 20 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  f.  ){.    nSize
94c0: 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45   = EXPR_FULLSIZE
94d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
94e0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
94f0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
9500: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
9510: 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ed) );.    asser
9520: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
9530: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
9540: 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65  in) ); .    asse
9550: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9560: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
9570: 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ken) );.    asse
9580: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9590: 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64  erty(p, EP_NoRed
95a0: 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20  uce) );.    if( 
95b0: 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78  p->pLeft || p->x
95c0: 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  .pList ){.      
95d0: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44  nSize = EXPR_RED
95e0: 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65  UCEDSIZE | EP_Re
95f0: 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65  duced;.    }else
9600: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9610: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
9620: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
9630: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
9640: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b   | EP_TokenOnly;
9650: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9660: 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  urn nSize;.}../*
9670: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
9680: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70  n returns the sp
9690: 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71  ace in bytes req
96a0: 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74  uired to store t
96b0: 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74  he copy .** of t
96c0: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
96d0: 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  e and a copy of 
96e0: 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  the Expr.u.zToke
96f0: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61  n string (if tha
9700: 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64  t.** string is d
9710: 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74  efined.).*/.stat
9720: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
9730: 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70  NodeSize(Expr *p
9740: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
9750: 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65  int nByte = dupe
9760: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
9770: 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66  p, flags) & 0xff
9780: 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  f;.  if( !ExprHa
9790: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
97a0: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
97b0: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
97c0: 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
97d0: 53 74 72 6c 65 6e 33 30 4e 4e 28 70 2d 3e 75 2e  Strlen30NN(p->u.
97e0: 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20  zToken)+1;.  }. 
97f0: 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e   return ROUND8(n
9800: 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Byte);.}../*.** 
9810: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
9820: 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
9830: 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  red to create a 
9840: 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65  duplicate of the
9850: 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20   .** expression 
9860: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
9870: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
9880: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
9890: 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63  t is a.** mask c
98a0: 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55  ontaining EXPRDU
98b0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a  P_XXX flags..**.
98c0: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
98d0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73  urned includes s
98e0: 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61  pace to create a
98f0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
9900: 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65  r struct.** itse
9910: 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65  lf and the buffe
9920: 72 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79  r referred to by
9930: 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20   Expr.u.zToken, 
9940: 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  if any..**.** If
9950: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
9960: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
9970: 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
9980: 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20   value includes 
9990: 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70  .** space to dup
99a0: 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20  licate all Expr 
99b0: 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65  nodes in the tre
99c0: 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72  e formed by Expr
99d0: 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45  .pLeft .** and E
99e0: 78 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61  xpr.pRight varia
99f0: 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f  bles (but not fo
9a00: 72 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73  r any structures
9a10: 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a   pointed to or .
9a20: 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f  ** descended fro
9a30: 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69  m the Expr.x.pLi
9a40: 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65  st or Expr.x.pSe
9a50: 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e  lect variables).
9a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9a70: 75 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70  upedExprSize(Exp
9a80: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
9a90: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
9aa0: 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  0;.  if( p ){.  
9ab0: 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45    nByte = dupedE
9ac0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
9ad0: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66  lags);.    if( f
9ae0: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
9af0: 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79  UCE ){.      nBy
9b00: 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53  te += dupedExprS
9b10: 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c  ize(p->pLeft, fl
9b20: 61 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72  ags) + dupedExpr
9b30: 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20  Size(p->pRight, 
9b40: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
9b50: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65  }.  return nByte
9b60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9b70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
9b80: 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78  lar to sqlite3Ex
9b90: 70 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20  prDup(), except 
9ba0: 74 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72  that if pzBuffer
9bb0: 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   .** is not NULL
9bc0: 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20   then *pzBuffer 
9bd0: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f  is assumed to po
9be0: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
9bf0: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a  large enough .**
9c00: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
9c10: 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  py of expression
9c20: 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f   p, the copies o
9c30: 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a  f p->u.zToken.**
9c40: 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29   (if applicable)
9c50: 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73  , and the copies
9c60: 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74   of the p->pLeft
9c70: 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65   and p->pRight e
9c80: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69  xpressions,.** i
9c90: 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65  f any. Before re
9ca0: 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66  turning, *pzBuff
9cb0: 65 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  er is set to the
9cc0: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
9cd0: 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20   the.** portion 
9ce0: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  of the buffer co
9cf0: 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69  pied into by thi
9d00: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
9d10: 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72  tatic Expr *expr
9d20: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
9d30: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 64 75   Expr *p, int du
9d40: 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42  pFlags, u8 **pzB
9d50: 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a  uffer){.  Expr *
9d60: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
9d70: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
9d80: 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c  rn */.  u8 *zAll
9d90: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  oc;           /*
9da0: 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 66 72   Memory space fr
9db0: 6f 6d 20 77 68 69 63 68 20 74 6f 20 62 75 69 6c  om which to buil
9dc0: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f  d Expr object */
9dd0: 0a 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61  .  u32 staticFla
9de0: 67 3b 20 20 20 20 20 20 20 2f 2a 20 45 50 5f 53  g;       /* EP_S
9df0: 74 61 74 69 63 20 69 66 20 73 70 61 63 65 20 6e  tatic if space n
9e00: 6f 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ot obtained from
9e10: 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73   malloc */..  as
9e20: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
9e30: 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20   assert( p );.  
9e40: 61 73 73 65 72 74 28 20 64 75 70 46 6c 61 67 73  assert( dupFlags
9e50: 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d  ==0 || dupFlags=
9e60: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
9e70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 42  );.  assert( pzB
9e80: 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46  uffer==0 || dupF
9e90: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
9ea0: 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  DUCE );..  /* Fi
9eb0: 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74  gure out where t
9ec0: 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20  o write the new 
9ed0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20  Expr structure. 
9ee0: 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75 66 66 65  */.  if( pzBuffe
9ef0: 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20  r ){.    zAlloc 
9f00: 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20  = *pzBuffer;.   
9f10: 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50   staticFlag = EP
9f20: 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65  _Static;.  }else
9f30: 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73  {.    zAlloc = s
9f40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
9f50: 77 4e 4e 28 64 62 2c 20 64 75 70 65 64 45 78 70  wNN(db, dupedExp
9f60: 72 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67  rSize(p, dupFlag
9f70: 73 29 29 3b 0a 20 20 20 20 73 74 61 74 69 63 46  s));.    staticF
9f80: 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  lag = 0;.  }.  p
9f90: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
9fa0: 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65  lloc;..  if( pNe
9fb0: 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20  w ){.    /* Set 
9fc0: 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20  nNewSize to the 
9fd0: 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  size allocated f
9fe0: 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65  or the structure
9ff0: 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20   pointed to.    
a000: 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73  ** by pNew. This
a010: 20 69 73 20 65 69 74 68 65 72 20 45 58 50 52 5f   is either EXPR_
a020: 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52  FULLSIZE, EXPR_R
a030: 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20  EDUCEDSIZE or.  
a040: 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f    ** EXPR_TOKENO
a050: 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20  NLYSIZE. nToken 
a060: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
a070: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f  mber of bytes co
a080: 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79  nsumed.    ** by
a090: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65   the copy of the
a0a0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72   p->u.zToken str
a0b0: 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  ing (if any)..  
a0c0: 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75    */.    const u
a0d0: 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53  nsigned nStructS
a0e0: 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72 53  ize = dupedExprS
a0f0: 74 72 75 63 74 53 69 7a 65 28 70 2c 20 64 75 70  tructSize(p, dup
a100: 46 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73  Flags);.    cons
a110: 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d  t int nNewSize =
a120: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 30   nStructSize & 0
a130: 78 66 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54  xfff;.    int nT
a140: 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 21 45  oken;.    if( !E
a150: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a160: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
a170: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
a180: 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20  .      nToken = 
a190: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
a1a0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31  p->u.zToken) + 1
a1b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a1c0: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20     nToken = 0;. 
a1d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 75 70     }.    if( dup
a1e0: 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 61  Flags ){.      a
a1f0: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
a200: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64  operty(p, EP_Red
a210: 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20  uced)==0 );.    
a220: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
a230: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
a240: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a250: 75 33 32 20 6e 53 69 7a 65 20 3d 20 28 75 33 32  u32 nSize = (u32
a260: 29 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  )exprStructSize(
a270: 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  p);.      memcpy
a280: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a  (zAlloc, p, nSiz
a290: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53  e);.      if( nS
a2a0: 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a  ize<EXPR_FULLSIZ
a2b0: 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20 6d 65  E ){ .        me
a2c0: 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69  mset(&zAlloc[nSi
a2d0: 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c  ze], 0, EXPR_FUL
a2e0: 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20  LSIZE-nSize);.  
a2f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a300: 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52   /* Set the EP_R
a310: 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e  educed, EP_Token
a320: 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61  Only, and EP_Sta
a330: 74 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70  tic flags approp
a340: 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20  riately. */.    
a350: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pNew->flags &= ~
a360: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
a370: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74  okenOnly|EP_Stat
a380: 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b  ic|EP_MemToken);
a390: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
a3a0: 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20   |= nStructSize 
a3b0: 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50  & (EP_Reduced|EP
a3c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20  _TokenOnly);.   
a3d0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
a3e0: 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20  staticFlag;..   
a3f0: 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e   /* Copy the p->
a400: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c  u.zToken string,
a410: 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
a420: 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( nToken ){.  
a430: 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e      char *zToken
a440: 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65   = pNew->u.zToke
a450: 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c  n = (char*)&zAll
a460: 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20  oc[nNewSize];.  
a470: 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65      memcpy(zToke
a480: 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  n, p->u.zToken, 
a490: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a  nToken);.    }..
a4a0: 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e      if( 0==((p->
a4b0: 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67  flags|pNew->flag
a4c0: 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e  s) & (EP_TokenOn
a4d0: 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a  ly|EP_Leaf)) ){.
a4e0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
a4f0: 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65   the pNew->x.pSe
a500: 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e  lect or pNew->x.
a510: 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f  pList member. */
a520: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
a530: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
a540: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
a550: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
a560: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
a570: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
a580: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75 70 46  >x.pSelect, dupF
a590: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lags);.      }el
a5a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
a5b0: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69  ->x.pList = sqli
a5c0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
a5d0: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 64  b, p->x.pList, d
a5e0: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a5f0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a600: 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c  Fill in pNew->pL
a610: 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52  eft and pNew->pR
a620: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ight. */.    if(
a630: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a640: 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65  (pNew, EP_Reduce
a650: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  d|EP_TokenOnly|E
a660: 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
a670: 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75      zAlloc += du
a680: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
a690: 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  p, dupFlags);.  
a6a0: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a6b0: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
a6c0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
a6d0: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
a6e0: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
a6f0: 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20  >pLeft ?.       
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
a710: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
a720: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
a730: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20  UCE, &zAlloc) : 
a740: 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
a750: 3e 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69  >pRight = p->pRi
a760: 67 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20  ght ?.          
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
a780: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
a790: 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ht, EXPRDUP_REDU
a7a0: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30  CE, &zAlloc) : 0
a7b0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
a7c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
a7d0: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69  NDOWFUNC.      i
a7e0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a7f0: 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63  ty(p, EP_WinFunc
a800: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
a810: 77 2d 3e 79 2e 70 57 69 6e 20 3d 20 73 71 6c 69  w->y.pWin = sqli
a820: 74 65 33 57 69 6e 64 6f 77 44 75 70 28 64 62 2c  te3WindowDup(db,
a830: 20 70 4e 65 77 2c 20 70 2d 3e 79 2e 70 57 69 6e   pNew, p->y.pWin
a840: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a850: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
a860: 74 79 28 70 4e 65 77 2c 20 45 50 5f 57 69 6e 46  ty(pNew, EP_WinF
a870: 75 6e 63 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a  unc) );.      }.
a880: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
a890: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
a8a0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 7a   */.      if( pz
a8b0: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
a8c0: 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41    *pzBuffer = zA
a8d0: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lloc;.      }.  
a8e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
a8f0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a900: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
a910: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
a920: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
a930: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
a940: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
a950: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
a960: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
a970: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a980: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70  >iColumn==0 || p
a990: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
a9a0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
a9b0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c   p->pRight==0  |
a9c0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e  | p->pRight==p->
a9d0: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20  pLeft );.       
a9e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a9f0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
aa00: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
aa10: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
aa20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aa30: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
aa40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
aa50: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
aa60: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
aa70: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
aa80: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
aa90: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
aaa0: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
aab0: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
aac0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
aad0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
aae0: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
aaf0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
ab00: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
ab10: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
ab20: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
ab30: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
ab40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
ab50: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
ab60: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
ab70: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
ab80: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
ab90: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
aba0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
abb0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
abc0: 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   + sizeof(p->a[0
abd0: 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29  ]) * (p->nCte-1)
abe0: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
abf0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
ac00: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
ac10: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
ac20: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
ac30: 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e  pRet->nCte = p->
ac40: 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  nCte;.      for(
ac50: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20  i=0; i<p->nCte; 
ac60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 52  i++){.        pR
ac70: 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  et->a[i].pSelect
ac80: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
ac90: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
aca0: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
acb0: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
acc0: 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 45  pCols = sqlite3E
acd0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
ace0: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29  ->a[i].pCols, 0)
acf0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
ad00: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
ad10: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
ad20: 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b   p->a[i].zName);
ad30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ad40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
ad50: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
ad60: 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29 20  ne withDup(x,y) 
ad70: 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  0.#endif..#ifnde
ad80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
ad90: 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 54  NDOWFUNC./*.** T
ada0: 68 65 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  he gatherSelectW
adb0: 69 6e 64 6f 77 73 28 29 20 70 72 6f 63 65 64 75  indows() procedu
adc0: 72 65 20 61 6e 64 20 69 74 73 20 68 65 6c 70 65  re and its helpe
add0: 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 67 61 74  r routine.** gat
ade0: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
adf0: 43 61 6c 6c 62 61 63 6b 28 29 20 61 72 65 20 75  Callback() are u
ae00: 73 65 64 20 74 6f 20 73 63 61 6e 20 61 6c 6c 20  sed to scan all 
ae10: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
ae20: 2a 2a 20 61 6e 20 61 20 6e 65 77 6c 79 20 64 75  ** an a newly du
ae30: 70 6c 69 63 61 74 65 64 20 53 45 4c 45 43 54 20  plicated SELECT 
ae40: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 67 61  statement and ga
ae50: 74 68 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  ther all of the 
ae60: 57 69 6e 64 6f 77 0a 2a 2a 20 6f 62 6a 65 63 74  Window.** object
ae70: 73 20 66 6f 75 6e 64 20 74 68 65 72 65 2c 20 61  s found there, a
ae80: 73 73 65 6d 62 6c 69 6e 67 20 74 68 65 6d 20 6f  ssembling them o
ae90: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
aea0: 69 73 74 20 61 74 20 53 65 6c 65 63 74 2d 3e 70  ist at Select->p
aeb0: 57 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Win..*/.static i
aec0: 6e 74 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  nt gatherSelectW
aed0: 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b 28 57  indowsCallback(W
aee0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
aef0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
af00: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
af10: 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 45 78  K_FUNCTION && Ex
af20: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
af30: 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  xpr, EP_WinFunc)
af40: 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
af50: 70 53 65 6c 65 63 74 20 3d 20 70 57 61 6c 6b 65  pSelect = pWalke
af60: 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->u.pSelect;.  
af70: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d    Window *pWin =
af80: 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 3b 0a   pExpr->y.pWin;.
af90: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
afa0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
afb0: 49 73 57 69 6e 64 6f 77 46 75 6e 63 28 70 45 78  IsWindowFunc(pEx
afc0: 70 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pr) );.    asser
afd0: 74 28 20 70 57 69 6e 2d 3e 70 70 54 68 69 73 3d  t( pWin->ppThis=
afe0: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
aff0: 33 57 69 6e 64 6f 77 4c 69 6e 6b 28 70 53 65 6c  3WindowLink(pSel
b000: 65 63 74 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 0a  ect, pWin);.  }.
b010: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
b020: 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
b030: 69 6e 74 20 67 61 74 68 65 72 53 65 6c 65 63 74  int gatherSelect
b040: 57 69 6e 64 6f 77 73 53 65 6c 65 63 74 43 61 6c  WindowsSelectCal
b050: 6c 62 61 63 6b 28 57 61 6c 6b 65 72 20 2a 70 57  lback(Walker *pW
b060: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
b070: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d 70  ){.  return p==p
b080: 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63  Walker->u.pSelec
b090: 74 20 3f 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  t ? WRC_Continue
b0a0: 20 3a 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a   : WRC_Prune;.}.
b0b0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 61 74 68  static void gath
b0c0: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28  erSelectWindows(
b0d0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61  Select *p){.  Wa
b0e0: 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70  lker w;.  w.xExp
b0f0: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74 68  rCallback = gath
b100: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 43  erSelectWindowsC
b110: 61 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78 53 65  allback;.  w.xSe
b120: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 67  lectCallback = g
b130: 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f  atherSelectWindo
b140: 77 73 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  wsSelectCallback
b150: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
b160: 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e  lback2 = 0;.  w.
b170: 70 50 61 72 73 65 20 3d 20 30 3b 0a 20 20 77 2e  pParse = 0;.  w.
b180: 75 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20  u.pSelect = p;. 
b190: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
b1a0: 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 23 65 6e  ct(&w, p);.}.#en
b1b0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
b1c0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
b1d0: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
b1e0: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
b1f0: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
b200: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
b210: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
b220: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
b230: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
b240: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
b250: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
b260: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
b270: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
b280: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
b290: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
b2a0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
b2b0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
b2c0: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
b2d0: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
b2e0: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
b2f0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
b300: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
b310: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
b320: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
b330: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
b340: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
b350: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
b360: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
b370: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
b380: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
b390: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
b3a0: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
b3b0: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
b3c0: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
b3d0: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
b3e0: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
b3f0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
b400: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
b410: 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  gs..** If the EX
b420: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
b430: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
b440: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  he structure ret
b450: 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72  urned is a.** tr
b460: 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20  uncated version 
b470: 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70  of the usual Exp
b480: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
b490: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
b4a0: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  as.** part of th
b4b0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
b4c0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
b4d0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
b4e0: 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  a..*/.Expr *sqli
b4f0: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
b500: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
b510: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
b520: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
b530: 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  || flags==EXPRDU
b540: 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65  P_REDUCE );.  re
b550: 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70  turn p ? exprDup
b560: 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30  (db, p, flags, 0
b570: 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73  ) : 0;.}.ExprLis
b580: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
b590: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
b5a0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  b, ExprList *p, 
b5b0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78  int flags){.  Ex
b5c0: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
b5d0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
b5e0: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
b5f0: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
b600: 0a 20 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53  .  Expr *pPriorS
b610: 65 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20  electCol = 0;.  
b620: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
b630: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
b640: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
b650: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b660: 52 61 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65  RawNN(db, sqlite
b670: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
b680: 2c 20 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  , p));.  if( pNe
b690: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
b6a0: 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d  .  pNew->nExpr =
b6b0: 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74   p->nExpr;.  pIt
b6c0: 65 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20  em = pNew->a;.  
b6d0: 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b  pOldItem = p->a;
b6e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
b6f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
b700: 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b  em++, pOldItem++
b710: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c  ){.    Expr *pOl
b720: 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d  dExpr = pOldItem
b730: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ->pExpr;.    Exp
b740: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
b750: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
b760: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b770: 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61  b, pOldExpr, fla
b780: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  gs);.    if( pOl
b790: 64 45 78 70 72 20 0a 20 20 20 20 20 26 26 20 70  dExpr .     && p
b7a0: 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  OldExpr->op==TK_
b7b0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20  SELECT_COLUMN.  
b7c0: 20 20 20 26 26 20 28 70 4e 65 77 45 78 70 72 20     && (pNewExpr 
b7d0: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21  = pItem->pExpr)!
b7e0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
b7f0: 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70   assert( pNewExp
b800: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c  r->iColumn==0 ||
b810: 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66   i>0 );.      if
b820: 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c  ( pNewExpr->iCol
b830: 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
b840: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78    assert( pOldEx
b850: 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45  pr->pLeft==pOldE
b860: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20  xpr->pRight );. 
b870: 20 20 20 20 20 20 20 70 50 72 69 6f 72 53 65 6c         pPriorSel
b880: 65 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78 70  ectCol = pNewExp
b890: 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 45  r->pLeft = pNewE
b8a0: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
b8b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b8c0: 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
b8d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b8e0: 20 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72   pItem[-1].pExpr
b8f0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
b900: 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d  ssert( pNewExpr-
b910: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b  >iColumn==pItem[
b920: 2d 31 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75  -1].pExpr->iColu
b930: 6d 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  mn+1 );.        
b940: 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 53 65  assert( pPriorSe
b950: 6c 65 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d  lectCol==pItem[-
b960: 31 5d 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  1].pExpr->pLeft 
b970: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 45  );.        pNewE
b980: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50 72  xpr->pLeft = pPr
b990: 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20 20  iorSelectCol;.  
b9a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b9b0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
b9c0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b9d0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
b9e0: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
b9f0: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
ba00: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
ba10: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
ba20: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 46 6c 61    pItem->sortFla
ba30: 67 73 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  gs = pOldItem->s
ba40: 6f 72 74 46 6c 61 67 73 3b 0a 20 20 20 20 70 49  ortFlags;.    pI
ba50: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
ba60: 20 20 20 70 49 74 65 6d 2d 3e 62 4e 75 6c 6c 73     pItem->bNulls
ba70: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 4e 75   = pOldItem->bNu
ba80: 6c 6c 73 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  lls;.    pItem->
ba90: 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c  bSpanIsTab = pOl
baa0: 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  dItem->bSpanIsTa
bab0: 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53  b;.    pItem->bS
bac0: 6f 72 74 65 72 52 65 66 20 3d 20 70 4f 6c 64 49  orterRef = pOldI
bad0: 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 3b  tem->bSorterRef;
bae0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20  .    pItem->u = 
baf0: 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d  pOldItem->u;.  }
bb00: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
bb10: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73  }../*.** If curs
bb20: 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76  ors, triggers, v
bb30: 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
bb40: 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74  ies are all omit
bb50: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
bb60: 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  build, then none
bb70: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
bb80: 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65  g routines, exce
bb90: 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74  pt for .** sqlit
bba0: 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63  e3SelectDup(), c
bbb0: 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71  an be called. sq
bbc0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
bbd0: 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a   is sometimes.**
bbe0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e   called with a N
bbf0: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
bc00: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
bc10: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
bc20: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
bc30: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
bc40: 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28   \. || !defined(
bc50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
bc60: 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73  UERY).SrcList *s
bc70: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
bc80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
bc90: 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  cList *p, int fl
bca0: 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  ags){.  SrcList 
bcb0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
bcc0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61    int nByte;.  a
bcd0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
bce0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
bcf0: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
bd00: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
bd10: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
bd20: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
bd30: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
bd40: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
bd50: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
bd60: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
bd70: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
bd80: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
bd90: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
bda0: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
bdb0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
bdc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
bdd0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
bde0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
bdf0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
be00: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
be10: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
be20: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
be30: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
be40: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70  tem->pSchema = p
be50: 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61  OldItem->pSchema
be60: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
be70: 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
be80: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
be90: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pOldItem->zDatab
bea0: 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ase);.    pNewIt
beb0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
bec0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
bed0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
bee0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
bef0: 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
bf00: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
bf10: 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  dItem->zAlias);.
bf20: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67      pNewItem->fg
bf30: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b   = pOldItem->fg;
bf40: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
bf50: 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65  Cursor = pOldIte
bf60: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
bf70: 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69  pNewItem->addrFi
bf80: 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d  llSub = pOldItem
bf90: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20  ->addrFillSub;. 
bfa0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67     pNewItem->reg
bfb0: 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65  Return = pOldIte
bfc0: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
bfd0: 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e    if( pNewItem->
bfe0: 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
bff0: 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d  {.      pNewItem
c000: 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20  ->u1.zIndexedBy 
c010: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
c020: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c030: 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a  u1.zIndexedBy);.
c040: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
c050: 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70  em->pIBIndex = p
c060: 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65  OldItem->pIBInde
c070: 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49  x;.    if( pNewI
c080: 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
c090: 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49  c ){.      pNewI
c0a0: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
c0b0: 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71   = .          sq
c0c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c0d0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75  (db, pOldItem->u
c0e0: 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61 67  1.pFuncArg, flag
c0f0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  s);.    }.    pT
c100: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
c110: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
c120: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
c130: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
c140: 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20  ->nTabRef++;.   
c150: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
c160: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
c170: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
c180: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
c190: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  t, flags);.    p
c1a0: 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73  NewItem->pOn = s
c1b0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
c1c0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c  , pOldItem->pOn,
c1d0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c1e0: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
c1f0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
c200: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
c210: 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77  Using);.    pNew
c220: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20  Item->colUsed = 
c230: 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pOldItem->colUse
c240: 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  d;.  }.  return 
c250: 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a  pNew;.}.IdList *
c260: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
c270: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
c280: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
c290: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
c2a0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  i;.  assert( db!
c2b0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
c2c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
c2d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
c2e0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
c2f0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
c300: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
c310: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
c320: 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a  ->nId = p->nId;.
c330: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
c340: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
c350: 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  (db, p->nId*size
c360: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
c370: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
c380: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
c390: 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65 77 29  FreeNN(db, pNew)
c3a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
c3b0: 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68    }.  /* Note th
c3c0: 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73  at because the s
c3d0: 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  ize of the alloc
c3e0: 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d  ation for p->a[]
c3f0: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63   is not.  ** nec
c400: 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72  essarily a power
c410: 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33   of two, sqlite3
c420: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d  IdListAppend() m
c430: 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ay not be called
c440: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70  .  ** on the dup
c450: 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62  licate created b
c460: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
c470: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
c480: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
c490: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
c4a0: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
c4b0: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
c4c0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
c4d0: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
c4e0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
c4f0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
c500: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
c510: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c520: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
c530: 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64  Item->idx = pOld
c540: 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20  Item->idx;.  }. 
c550: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
c560: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
c570: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
c580: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 44   *db, Select *pD
c590: 75 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  up, int flags){.
c5a0: 20 20 53 65 6c 65 63 74 20 2a 70 52 65 74 20 3d    Select *pRet =
c5b0: 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e   0;.  Select *pN
c5c0: 65 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63  ext = 0;.  Selec
c5d0: 74 20 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a  t **pp = &pRet;.
c5e0: 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a 20 20    Select *p;..  
c5f0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
c600: 0a 20 20 66 6f 72 28 70 3d 70 44 75 70 3b 20 70  .  for(p=pDup; p
c610: 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  ; p=p->pPrior){.
c620: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
c630: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c640: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
c650: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 69 66  of(*p) );.    if
c660: 28 20 70 4e 65 77 3d 3d 30 20 29 20 62 72 65 61  ( pNew==0 ) brea
c670: 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c  k;.    pNew->pEL
c680: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
c690: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
c6a0: 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a  pEList, flags);.
c6b0: 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d      pNew->pSrc =
c6c0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
c6d0: 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20  up(db, p->pSrc, 
c6e0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c6f0: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
c700: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
c710: 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b  >pWhere, flags);
c720: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  .    pNew->pGrou
c730: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
c740: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
c750: 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29  pGroupBy, flags)
c760: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76  ;.    pNew->pHav
c770: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
c780: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76  rDup(db, p->pHav
c790: 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ing, flags);.   
c7a0: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
c7b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
c7c0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64  tDup(db, p->pOrd
c7d0: 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  erBy, flags);.  
c7e0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
c7f0: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e  op;.    pNew->pN
c800: 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20  ext = pNext;.   
c810: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
c820: 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69  0;.    pNew->pLi
c830: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mit = sqlite3Exp
c840: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  rDup(db, p->pLim
c850: 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  it, flags);.    
c860: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
c870: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66  ;.    pNew->iOff
c880: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  set = 0;.    pNe
c890: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  w->selFlags = p-
c8a0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f  >selFlags & ~SF_
c8b0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
c8c0: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65     pNew->addrOpe
c8d0: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
c8e0: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65     pNew->addrOpe
c8f0: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
c900: 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74     pNew->nSelect
c910: 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74  Row = p->nSelect
c920: 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  Row;.    pNew->p
c930: 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64  With = withDup(d
c940: 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 23 69  b, p->pWith);.#i
c950: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c960: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
c970: 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b   pNew->pWin = 0;
c980: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44  .    pNew->pWinD
c990: 65 66 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e  efn = sqlite3Win
c9a0: 64 6f 77 4c 69 73 74 44 75 70 28 64 62 2c 20 70  dowListDup(db, p
c9b0: 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20 20 20  ->pWinDefn);.   
c9c0: 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 26 26 20   if( p->pWin && 
c9d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c9e0: 3d 3d 30 20 29 20 67 61 74 68 65 72 53 65 6c 65  ==0 ) gatherSele
c9f0: 63 74 57 69 6e 64 6f 77 73 28 70 4e 65 77 29 3b  ctWindows(pNew);
ca00: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 77  .#endif.    pNew
ca10: 2d 3e 73 65 6c 49 64 20 3d 20 70 2d 3e 73 65 6c  ->selId = p->sel
ca20: 49 64 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 4e  Id;.    *pp = pN
ca30: 65 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70 4e  ew;.    pp = &pN
ca40: 65 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  ew->pPrior;.    
ca50: 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
ca60: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
ca70: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
ca80: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
ca90: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
caa0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66  Select *p, int f
cab0: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
cac0: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
cad0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
cae0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
caf0: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
cb00: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
cb10: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
cb20: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
cb30: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
cb40: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
cb50: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
cb60: 2a 2a 20 54 68 65 20 70 4c 69 73 74 20 61 72 67  ** The pList arg
cb70: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 69  ument must be ei
cb80: 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 70  ther NULL or a p
cb90: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 45 78 70  ointer to an Exp
cba0: 72 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69 6e 65  rList.** obtaine
cbb0: 64 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  d from a prior c
cbc0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 78  all to sqlite3Ex
cbd0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 2e 20  prListAppend(). 
cbe0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
cbf0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
cc00: 20 77 69 74 68 20 61 6e 20 45 78 70 72 4c 69 73   with an ExprLis
cc10: 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
cc20: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
cc30: 75 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f 6e 3a  up()..** Reason:
cc40: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
cc50: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
cc60: 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  number of slots 
cc70: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a 2a 2a  in pList->a[].**
cc80: 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74   is a power of t
cc90: 77 6f 2e 20 20 54 68 61 74 20 69 73 20 74 72 75  wo.  That is tru
cca0: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70  e for sqlite3Exp
ccb0: 72 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 65  rListAppend() re
ccc0: 74 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69 73 20  turns.** but is 
ccd0: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
cce0: 74 72 75 65 20 66 72 6f 6d 20 74 68 65 20 72 65  true from the re
ccf0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
cd00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
cd10: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  ()..**.** If a m
cd20: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
cd30: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
cd40: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
cd50: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
cd60: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
cd70: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
cd80: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
cd90: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
cda0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
cdb0: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
cdc0: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
cdd0: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
cde0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
cdf0: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
ce00: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
ce10: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ce20: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
ce30: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
ce40: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
ce50: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
ce60: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
ce70: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
ce80: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
ce90: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
cea0: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
ceb0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  LL */.){.  struc
cec0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
ced0: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
cee0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
cef0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
cf00: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
cf10: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
cf20: 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
cf30: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
cf40: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
cf50: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
cf60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
cf70: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
cf80: 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20     pList->nExpr 
cf90: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
cfa0: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26   (pList->nExpr &
cfb0: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31   (pList->nExpr-1
cfc0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70  ))==0 ){.    Exp
cfd0: 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  rList *pNew;.   
cfe0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
cff0: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69  bRealloc(db, pLi
d000: 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 73 69  st, .         si
d010: 7a 65 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a  zeof(*pList)+(2*
d020: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
d030: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 2a 73  List->nExpr-1)*s
d040: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
d050: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ]));.    if( pNe
d060: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  w==0 ){.      go
d070: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
d080: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
d090: 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  w;.  }.  pItem =
d0a0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
d0b0: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61 73  ->nExpr++];.  as
d0c0: 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73  sert( offsetof(s
d0d0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
d0e0: 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65  tem,zName)==size
d0f0: 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  of(pItem->pExpr)
d100: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
d110: 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78  fsetof(struct Ex
d120: 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78 70  prList_item,pExp
d130: 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  r)==0 );.  memse
d140: 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  t(&pItem->zName,
d150: 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  0,sizeof(*pItem)
d160: 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74  -offsetof(struct
d170: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a   ExprList_item,z
d180: 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d 2d  Name));.  pItem-
d190: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
d1a0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
d1b0: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
d1c0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
d1d0: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
d1e0: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
d1f0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
d200: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
d210: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
d220: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
d230: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  st);.  return 0;
d240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d  .}../*.** pColum
d250: 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72  ns and pExpr for
d260: 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69 67  m a vector assig
d270: 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 70  nment which is p
d280: 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a  art of the SET.*
d290: 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55  * clause of an U
d2a0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
d2b0: 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
d2c0: 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63  **        (a,b,c
d2d0: 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32  ) = (expr1,expr2
d2e0: 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20  ,expr3).** Or:  
d2f0: 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c    (a,b,c) = (SEL
d300: 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e  ECT x,y,z FROM .
d310: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ...).**.** For e
d320: 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ach term of the 
d330: 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e  vector assignmen
d340: 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e  t, append new en
d350: 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  tries to the.** 
d360: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
d370: 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63  pList.  In the c
d380: 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65 72  ase of a subquer
d390: 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70  y on the RHS, ap
d3a0: 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43  pend.** TK_SELEC
d3b0: 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73  T_COLUMN express
d3c0: 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  ions..*/.ExprLis
d3d0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
d3e0: 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a  stAppendVector(.
d3f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d400: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
d410: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
d420: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d430: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
d440: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
d450: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
d460: 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  L */.  IdList *p
d470: 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a  Columns,      /*
d480: 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f   List of names o
d490: 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73  f LHS of the ass
d4a0: 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  ignment */.  Exp
d4b0: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
d4c0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78      /* Vector ex
d4d0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
d4e0: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
d4f0: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
d500: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d510: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
d520: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
d530: 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20   iFirst = pList 
d540: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
d550: 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e   0;.  /* pColumn
d560: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55  s can only be NU
d570: 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d  LL due to an OOM
d580: 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c   but an OOM will
d590: 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65   cause an.  ** e
d5a0: 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69  xit prior to thi
d5b0: 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20  s routine being 
d5c0: 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28  invoked */.  if(
d5d0: 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d   NEVER(pColumns=
d5e0: 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f  =0) ) goto vecto
d5f0: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a  r_append_error;.
d600: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
d610: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
d620: 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a  end_error;..  /*
d630: 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61   If the RHS is a
d640: 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65   vector, then we
d650: 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79   can immediately
d660: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
d670: 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a  at .  ** the siz
d680: 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64  e of the RHS and
d690: 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74   LHS match.  But
d6a0: 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 61   if the RHS is a
d6b0: 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77   SELECT, .  ** w
d6c0: 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20 69  ildcards ("*") i
d6d0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
d6e0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d   of the SELECT m
d6f0: 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
d700: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63  before.  ** we c
d710: 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63  an do the size c
d720: 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74  heck, so defer t
d730: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e  he size check un
d740: 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
d750: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
d760: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45  pExpr->op!=TK_SE
d770: 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73  LECT && pColumns
d780: 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65  ->nId!=(n=sqlite
d790: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
d7a0: 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73  pExpr)) ){.    s
d7b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d7c0: 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d  Parse, "%d colum
d7d0: 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76  ns assigned %d v
d7e0: 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20  alues",.        
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
d800: 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20  umns->nId, n);. 
d810: 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61     goto vector_a
d820: 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d  ppend_error;.  }
d830: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
d840: 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b  Columns->nId; i+
d850: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53  +){.    Expr *pS
d860: 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ubExpr = sqlite3
d870: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
d880: 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ld(pParse, pExpr
d890: 2c 20 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , i);.    assert
d8a0: 28 20 70 53 75 62 45 78 70 72 21 3d 30 20 7c 7c  ( pSubExpr!=0 ||
d8b0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d8c0: 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d );.    assert(
d8d0: 20 70 53 75 62 45 78 70 72 3d 3d 30 20 7c 7c 20   pSubExpr==0 || 
d8e0: 70 53 75 62 45 78 70 72 2d 3e 69 54 61 62 6c 65  pSubExpr->iTable
d8f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
d900: 53 75 62 45 78 70 72 3d 3d 30 20 29 20 63 6f 6e  SubExpr==0 ) con
d910: 74 69 6e 75 65 3b 0a 20 20 20 20 70 53 75 62 45  tinue;.    pSubE
d920: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43  xpr->iTable = pC
d930: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 20  olumns->nId;.   
d940: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
d950: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
d960: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53  Parse, pList, pS
d970: 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ubExpr);.    if(
d980: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
d990: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
d9a0: 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31  Expr==iFirst+i+1
d9b0: 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   );.      pList-
d9c0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
d9d0: 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75  1].zName = pColu
d9e0: 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  mns->a[i].zName;
d9f0: 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d  .      pColumns-
da00: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b  >a[i].zName = 0;
da10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
da20: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
da30: 6c 65 64 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  led && pExpr->op
da40: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 41  ==TK_SELECT && A
da50: 4c 57 41 59 53 28 70 4c 69 73 74 21 3d 30 29 20  LWAYS(pList!=0) 
da60: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 46 69  ){.    Expr *pFi
da70: 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  rst = pList->a[i
da80: 46 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20 20  First].pExpr;.  
da90: 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74    assert( pFirst
daa0: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
dab0: 74 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d 54  t( pFirst->op==T
dac0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
dad0: 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a 20  );.     .    /* 
dae0: 53 74 6f 72 65 20 74 68 65 20 53 45 4c 45 43 54  Store the SELECT
daf0: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 70 52   statement in pR
db00: 69 67 68 74 20 73 6f 20 69 74 20 77 69 6c 6c 20  ight so it will 
db10: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 0a  be deleted when.
db20: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78      ** sqlite3Ex
db30: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 29 20 69  prListDelete() i
db40: 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  s called */.    
db50: 70 46 69 72 73 74 2d 3e 70 52 69 67 68 74 20 3d  pFirst->pRight =
db60: 20 70 45 78 70 72 3b 0a 20 20 20 20 70 45 78 70   pExpr;.    pExp
db70: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52  r = 0;..    /* R
db80: 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a 65  emember the size
db90: 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 69   of the LHS in i
dba0: 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77 65  Table so that we
dbb0: 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74 0a   can check that.
dbc0: 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 61      ** the RHS a
dbd0: 6e 64 20 4c 48 53 20 73 69 7a 65 73 20 6d 61 74  nd LHS sizes mat
dbe0: 63 68 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67  ch during code g
dbf0: 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  eneration. */.  
dc00: 20 20 70 46 69 72 73 74 2d 3e 69 54 61 62 6c 65    pFirst->iTable
dc10: 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64   = pColumns->nId
dc20: 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61 70  ;.  }..vector_ap
dc30: 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71  pend_error:.  sq
dc40: 6c 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e  lite3ExprUnmapAn
dc50: 64 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20  dDelete(pParse, 
dc60: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
dc70: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
dc80: 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72  , pColumns);.  r
dc90: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
dca0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f  /*.** Set the so
dcb0: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  rt order for the
dcc0: 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e   last element on
dcd0: 20 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c   the given ExprL
dce0: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
dcf0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
dd00: 6f 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73  ortOrder(ExprLis
dd10: 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f  t *p, int iSortO
dd20: 72 64 65 72 2c 20 69 6e 74 20 65 4e 75 6c 6c 73  rder, int eNulls
dd30: 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
dd40: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
dd50: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
dd60: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
dd70: 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 0a   p->nExpr>0 );..
dd80: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
dd90: 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20  _SO_UNDEFINED<0 
dda0: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  && SQLITE_SO_ASC
ddb0: 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  ==0 && SQLITE_SO
ddc0: 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73  _DESC>0 );.  ass
ddd0: 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d  ert( iSortOrder=
dde0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46  =SQLITE_SO_UNDEF
ddf0: 49 4e 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  INED .       || 
de00: 69 53 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49  iSortOrder==SQLI
de10: 54 45 5f 53 4f 5f 41 53 43 20 0a 20 20 20 20 20  TE_SO_ASC .     
de20: 20 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d    || iSortOrder=
de30: 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20  =SQLITE_SO_DESC 
de40: 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
de50: 65 4e 75 6c 6c 73 3d 3d 53 51 4c 49 54 45 5f 53  eNulls==SQLITE_S
de60: 4f 5f 55 4e 44 45 46 49 4e 45 44 20 0a 20 20 20  O_UNDEFINED .   
de70: 20 20 20 20 7c 7c 20 65 4e 75 6c 6c 73 3d 3d 53      || eNulls==S
de80: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 0a 20 20  QLITE_SO_ASC .  
de90: 20 20 20 20 20 7c 7c 20 65 4e 75 6c 6c 73 3d 3d       || eNulls==
dea0: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 0a  SQLITE_SO_DESC .
deb0: 20 20 29 3b 0a 0a 20 20 70 49 74 65 6d 20 3d 20    );..  pItem = 
dec0: 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31  &p->a[p->nExpr-1
ded0: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ];.  assert( pIt
dee0: 65 6d 2d 3e 62 4e 75 6c 6c 73 3d 3d 30 20 29 3b  em->bNulls==0 );
def0: 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64 65  .  if( iSortOrde
df00: 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44  r==SQLITE_SO_UND
df10: 45 46 49 4e 45 44 20 29 7b 0a 20 20 20 20 69 53  EFINED ){.    iS
df20: 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54  ortOrder = SQLIT
df30: 45 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d 0a 20 20  E_SO_ASC;.  }.  
df40: 70 49 74 65 6d 2d 3e 73 6f 72 74 46 6c 61 67 73  pItem->sortFlags
df50: 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65   = (u8)iSortOrde
df60: 72 3b 0a 0a 20 20 69 66 28 20 65 4e 75 6c 6c 73  r;..  if( eNulls
df70: 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45  !=SQLITE_SO_UNDE
df80: 46 49 4e 45 44 20 29 7b 0a 20 20 20 20 70 49 74  FINED ){.    pIt
df90: 65 6d 2d 3e 62 4e 75 6c 6c 73 20 3d 20 31 3b 0a  em->bNulls = 1;.
dfa0: 20 20 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64      if( iSortOrd
dfb0: 65 72 21 3d 65 4e 75 6c 6c 73 20 29 7b 0a 20 20  er!=eNulls ){.  
dfc0: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 46      pItem->sortF
dfd0: 6c 61 67 73 20 7c 3d 20 4b 45 59 49 4e 46 4f 5f  lags |= KEYINFO_
dfe0: 4f 52 44 45 52 5f 42 49 47 4e 55 4c 4c 3b 0a 20  ORDER_BIGNULL;. 
dff0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e000: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
e010: 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65  st.a[].zName ele
e020: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
e030: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
e040: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
e050: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
e060: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
e070: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
e080: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
e090: 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f  .  But pName sho
e0a0: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
e0b0: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
e0c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
e0d0: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
e0e0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
e0f0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
e100: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e110: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
e120: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e130: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e140: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e150: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
e160: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
e170: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
e180: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
e190: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
e1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
e1b0: 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  me to be added *
e1c0: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e1e0: 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65  rue to cause the
e1f0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75   name to be dequ
e200: 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  oted */.){.  ass
e210: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
e220: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
e230: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
e240: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
e250: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
e260: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
e270: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
e280: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
e290: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
e2a0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
e2b0: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
e2c0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
e2d0: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   );.    pItem->z
e2e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
e2f0: 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e  StrNDup(pParse->
e300: 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  db, pName->z, pN
e310: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28  ame->n);.    if(
e320: 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74   dequote ) sqlit
e330: 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d  e3Dequote(pItem-
e340: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
e350: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
e360: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
e370: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
e380: 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29  (pParse, (void*)
e390: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 4e  pItem->zName, pN
e3a0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
e3b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
e3c0: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53   ExprList.a[].zS
e3d0: 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  pan element of t
e3e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
e3f0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
e400: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
e410: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
e420: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
e430: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
e440: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53  M error.  But pS
e450: 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  pan should never
e460: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
e470: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
e480: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
e490: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
e4a0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
e4b0: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
e4c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e4d0: 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65  SetSpan(.  Parse
e4e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e4f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e500: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
e510: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
e520: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
e530: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
e540: 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  pan. */.  const 
e550: 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20  char *zStart,   
e560: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68    /* Start of th
e570: 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73  e span */.  cons
e580: 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20  t char *zEnd    
e590: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
e5a0: 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73  e span */.){.  s
e5b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e5c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
e5d0: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64  t( pList!=0 || d
e5e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
e5f0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
e600: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
e610: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
e620: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
e630: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
e640: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
e650: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
e660: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e670: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
e680: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
e690: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
e6a0: 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74  bSpanDup(db, zSt
e6b0: 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a  art, zEnd);.  }.
e6c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
e6d0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
e6e0: 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  pEList contains 
e6f0: 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74  more than iLimit
e700: 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65   elements,.** le
e710: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
e720: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
e730: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
e740: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
e750: 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  th(.  Parse *pPa
e760: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
e770: 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74  *pEList,.  const
e780: 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29   char *zObject.)
e790: 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61  {.  int mx = pPa
e7a0: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
e7b0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
e7c0: 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  UMN];.  testcase
e7d0: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
e7e0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b  st->nExpr==mx );
e7f0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
e800: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
e810: 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20  Expr==mx+1 );.  
e820: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
e830: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29  List->nExpr>mx )
e840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e850: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
e860: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
e870: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
e880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
e890: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
e8a0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
e8b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
e8c0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
e8d0: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
e8e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
e8f0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
e900: 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
e910: 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74  >nExpr;.  struct
e920: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
e930: 70 49 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e  pItem =  pList->
e940: 61 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  a;.  assert( pLi
e950: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
e960: 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
e970: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
e980: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
e990: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e9a0: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  db, pItem->zName
e9b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e9c0: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
e9d0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
e9e0: 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d  m++;.  }while( -
e9f0: 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  -i>0 );.  sqlite
ea00: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c  3DbFreeNN(db, pL
ea10: 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ist);.}.void sql
ea20: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
ea30: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
ea40: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
ea50: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20  {.  if( pList ) 
ea60: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
ea70: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
ea80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
ea90: 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61   bitwise-OR of a
eaa0: 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69  ll Expr.flags fi
eab0: 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65  elds in the give
eac0: 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a  n.** ExprList..*
ead0: 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70  /.u32 sqlite3Exp
eae0: 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74  rListFlags(const
eaf0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
eb00: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33  ){.  int i;.  u3
eb10: 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  2 m = 0;.  asser
eb20: 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
eb30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
eb40: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
eb50: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
eb60: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
eb70: 45 78 70 72 3b 0a 20 20 20 20 20 61 73 73 65 72  Expr;.     asser
eb80: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
eb90: 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e      m |= pExpr->
eba0: 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74  flags;.  }.  ret
ebb0: 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn m;.}../*.** 
ebc0: 54 68 69 73 20 69 73 20 61 20 53 45 4c 45 43 54  This is a SELECT
ebd0: 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66  -node callback f
ebe0: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
ebf0: 6e 20 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a  n walker that.**
ec00: 20 61 6c 77 61 79 73 20 22 66 61 69 6c 73 22 2e   always "fails".
ec10: 20 20 42 79 20 22 66 61 69 6c 22 20 69 6e 20 74    By "fail" in t
ec20: 68 69 73 20 63 61 73 65 2c 20 77 65 20 6d 65 61  his case, we mea
ec30: 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72  n set.** pWalker
ec40: 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20  ->eCode to zero 
ec50: 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a  and abort..**.**
ec60: 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69   This callback i
ec70: 73 20 75 73 65 64 20 62 79 20 6d 75 6c 74 69 70  s used by multip
ec80: 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61  le expression wa
ec90: 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lkers..*/.int sq
eca0: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
ecb0: 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ail(Walker *pWal
ecc0: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
ecd0: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
ece0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
ecf0: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65  d);.  pWalker->e
ed00: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Code = 0;.  retu
ed10: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a  rn WRC_Abort;.}.
ed20: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
ed30: 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  put expression i
ed40: 73 20 61 6e 20 49 44 20 77 69 74 68 20 74 68 65  s an ID with the
ed50: 20 6e 61 6d 65 20 22 74 72 75 65 22 20 6f 72 20   name "true" or 
ed60: 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65 6e 20  "false".** then 
ed70: 63 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20  convert it into 
ed80: 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20  an TK_TRUEFALSE 
ed90: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 6e 6f  term.  Return no
eda0: 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74 68 65  n-zero if.** the
edb0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61 70 70   conversion happ
edc0: 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f 20 69  ened, and zero i
edd0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
ede0: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 0a 2a   is unaltered..*
edf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
ee00: 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 45  rIdToTrueFalse(E
ee10: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61  xpr *pExpr){.  a
ee20: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
ee30: 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78 70 72  ==TK_ID || pExpr
ee40: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
ee50: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
ee60: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
ee70: 20 45 50 5f 51 75 6f 74 65 64 29 0a 20 20 20 26   EP_Quoted).   &
ee80: 26 20 28 73 71 6c 69 74 65 33 53 74 72 49 43 6d  & (sqlite3StrICm
ee90: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
eea0: 6e 2c 20 22 74 72 75 65 22 29 3d 3d 30 0a 20 20  n, "true")==0.  
eeb0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53       || sqlite3S
eec0: 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
eed0: 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73 65 22 29  zToken, "false")
eee0: 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 70 45  ==0).  ){.    pE
eef0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52 55  xpr->op = TK_TRU
ef00: 45 46 41 4c 53 45 3b 0a 20 20 20 20 45 78 70 72  EFALSE;.    Expr
ef10: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
ef20: 72 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  r, pExpr->u.zTok
ef30: 65 6e 5b 34 5d 3d 3d 30 20 3f 20 45 50 5f 49 73  en[4]==0 ? EP_Is
ef40: 54 72 75 65 20 3a 20 45 50 5f 49 73 46 61 6c 73  True : EP_IsFals
ef50: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
ef60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
ef70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
ef80: 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
ef90: 61 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 45  a TK_TRUEFALSE E
efa0: 78 70 72 20 6e 6f 64 65 2e 20 20 52 65 74 75 72  xpr node.  Retur
efb0: 6e 20 31 20 69 66 20 69 74 20 69 73 20 54 52 55  n 1 if it is TRU
efc0: 45 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74  E.** and 0 if it
efd0: 20 69 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e   is FALSE..*/.in
efe0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  t sqlite3ExprTru
eff0: 74 68 56 61 6c 75 65 28 63 6f 6e 73 74 20 45 78  thValue(const Ex
f000: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 70 45  pr *pExpr){.  pE
f010: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
f020: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 28 45 78  rSkipCollate((Ex
f030: 70 72 2a 29 70 45 78 70 72 29 3b 0a 20 20 61 73  pr*)pExpr);.  as
f040: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
f050: 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 29 3b  =TK_TRUEFALSE );
f060: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f070: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
f080: 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75 65 22  >u.zToken,"true"
f090: 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73  )==0.       || s
f0a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
f0b0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 66  xpr->u.zToken,"f
f0c0: 61 6c 73 65 22 29 3d 3d 30 20 29 3b 0a 20 20 72  alse")==0 );.  r
f0d0: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 75 2e 7a  eturn pExpr->u.z
f0e0: 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a 0a  Token[4]==0;.}..
f0f0: 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  /*.** If pExpr i
f100: 73 20 61 6e 20 41 4e 44 20 6f 72 20 4f 52 20 65  s an AND or OR e
f110: 78 70 72 65 73 73 69 6f 6e 2c 20 74 72 79 20 74  xpression, try t
f120: 6f 20 73 69 6d 70 6c 69 66 79 20 69 74 20 62 79  o simplify it by
f130: 20 65 6c 69 6d 69 6e 61 74 69 6e 67 0a 2a 2a 20   eliminating.** 
f140: 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 61  terms that are a
f150: 6c 77 61 79 73 20 74 72 75 65 20 6f 72 20 66 61  lways true or fa
f160: 6c 73 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  lse.  Return the
f170: 20 73 69 6d 70 6c 69 66 69 65 64 20 65 78 70 72   simplified expr
f180: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 4f 72 20 72 65  ession..** Or re
f190: 74 75 72 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  turn the origina
f1a0: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 66 20  l expression if 
f1b0: 6e 6f 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f  no simplificatio
f1c0: 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  n is possible..*
f1d0: 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  *.** Examples:.*
f1e0: 2a 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30 29 20  *.**     (x<10) 
f1f0: 41 4e 44 20 74 72 75 65 20 20 20 20 20 20 20 20  AND true        
f200: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 28 78 3c          =>   (x<
f210: 31 30 29 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30  10).**     (x<10
f220: 29 20 41 4e 44 20 66 61 6c 73 65 20 20 20 20 20  ) AND false     
f230: 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 66            =>   f
f240: 61 6c 73 65 0a 2a 2a 20 20 20 20 20 28 78 3c 31  alse.**     (x<1
f250: 30 29 20 41 4e 44 20 28 79 3d 32 32 20 4f 52 20  0) AND (y=22 OR 
f260: 66 61 6c 73 65 29 20 20 20 20 20 3d 3e 20 20 20  false)     =>   
f270: 28 78 3c 31 30 29 20 41 4e 44 20 28 79 3d 32 32  (x<10) AND (y=22
f280: 29 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30 29 20  ).**     (x<10) 
f290: 41 4e 44 20 28 79 3d 32 32 20 4f 52 20 74 72 75  AND (y=22 OR tru
f2a0: 65 29 20 20 20 20 20 20 3d 3e 20 20 20 28 78 3c  e)      =>   (x<
f2b0: 31 30 29 0a 2a 2a 20 20 20 20 20 28 79 3d 32 32  10).**     (y=22
f2c0: 29 20 4f 52 20 74 72 75 65 20 20 20 20 20 20 20  ) OR true       
f2d0: 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74            =>   t
f2e0: 72 75 65 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  rue.*/.Expr *sql
f2f0: 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69  ite3ExprSimplifi
f300: 65 64 41 6e 64 4f 72 28 45 78 70 72 20 2a 70 45  edAndOr(Expr *pE
f310: 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  xpr){.  assert( 
f320: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 69 66  pExpr!=0 );.  if
f330: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f340: 41 4e 44 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  AND || pExpr->op
f350: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 45  ==TK_OR ){.    E
f360: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71  xpr *pRight = sq
f370: 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66  lite3ExprSimplif
f380: 69 65 64 41 6e 64 4f 72 28 70 45 78 70 72 2d 3e  iedAndOr(pExpr->
f390: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 45 78 70  pRight);.    Exp
f3a0: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
f3b0: 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69 65 64  e3ExprSimplified
f3c0: 41 6e 64 4f 72 28 70 45 78 70 72 2d 3e 70 4c 65  AndOr(pExpr->pLe
f3d0: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ft);.    if( Exp
f3e0: 72 41 6c 77 61 79 73 54 72 75 65 28 70 4c 65 66  rAlwaysTrue(pLef
f3f0: 74 29 20 7c 7c 20 45 78 70 72 41 6c 77 61 79 73  t) || ExprAlways
f400: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
f410: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
f420: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  Expr->op==TK_AND
f430: 20 3f 20 70 52 69 67 68 74 20 3a 20 70 4c 65 66   ? pRight : pLef
f440: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
f450: 20 45 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   ExprAlwaysTrue(
f460: 70 52 69 67 68 74 29 20 7c 7c 20 45 78 70 72 41  pRight) || ExprA
f470: 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74  lwaysFalse(pLeft
f480: 29 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  ) ){.      pExpr
f490: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
f4a0: 5f 41 4e 44 20 3f 20 70 4c 65 66 74 20 3a 20 70  _AND ? pLeft : p
f4b0: 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Right;.    }.  }
f4c0: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
f4d0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  .}.../*.** These
f4e0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
f4f0: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75  lker callbacks u
f500: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70  sed to check exp
f510: 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73  ressions to.** s
f520: 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22  ee if they are "
f530: 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f  constant" for so
f540: 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  me definition of
f550: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a   constant.  The.
f560: 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  ** Walker.eCode 
f570: 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73  value determines
f580: 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f   the type of "co
f590: 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c  nstant" we are l
f5a0: 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a  ooking.** for..*
f5b0: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
f5c0: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
f5d0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
f5e0: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
f5f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
f600: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
f610: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
f620: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f630: 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71  ode==1.**     sq
f640: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f650: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20  antNotJoin()    
f660: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
f670: 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20  eCode==2.**     
f680: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
f690: 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  leConstant()    
f6a0: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
f6b0: 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20  ->eCode==3.**   
f6c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
f6d0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
f6e0: 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b  n()        pWalk
f6f0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
f700: 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63  5.**.** In all c
f710: 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61  ases, the callba
f720: 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65  cks set Walker.e
f730: 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74  Code=0 and abort
f740: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
f750: 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74  on.** is found t
f760: 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74  o not be a const
f770: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ant..**.** The s
f780: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
f790: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
f7a0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61   is used for eva
f7b0: 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69  luating expressi
f7c0: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ons.** in a CREA
f7d0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
f7e0: 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e  nt.  The Walker.
f7f0: 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35  eCode value is 5
f800: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
f810: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
f820: 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70  ema and 4 when p
f830: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
f840: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
f850: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
f860: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
f870: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
f880: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
f890: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
f8a0: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
f8b0: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
f8c0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
f8d0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
f8e0: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
f8f0: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
f900: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
f910: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
f920: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
f930: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
f940: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
f950: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
f960: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
f970: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
f980: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
f990: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
f9a0: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
f9b0: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
f9c0: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
f9d0: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
f9e0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73  Walker->eCode is
f9f0: 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   2 then any term
fa00: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
fa10: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
fa20: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
fa30: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
fa40: 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64  of a left join d
fa50: 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20  isqualifies the 
fa60: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
fa70: 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69  from being consi
fa80: 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20  dered constant. 
fa90: 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  */.  if( pWalker
faa0: 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78  ->eCode==2 && Ex
fab0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
fac0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
fad0: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
fae0: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
faf0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
fb00: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
fb10: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
fb20: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
fb30: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
fb40: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
fb50: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
fb60: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
fb70: 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57  ** and either pW
fb80: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
fb90: 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63  or 5 or the func
fba0: 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20  tion has the.   
fbb0: 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ** SQLITE_FUNC_
fbc0: 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20  CONST flag. */. 
fbd0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
fbe0: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
fbf0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34  Walker->eCode>=4
fc00: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
fc10: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
fc20: 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  stFunc) ){.     
fc30: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
fc40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
fc50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61  lse{.        pWa
fc60: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
fc70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fc80: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
fc90: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
fca0: 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  D:.      /* Conv
fcb0: 65 72 74 20 22 74 72 75 65 22 20 6f 72 20 22 66  ert "true" or "f
fcc0: 61 6c 73 65 22 20 69 6e 20 61 20 44 45 46 41 55  alse" in a DEFAU
fcd0: 4c 54 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 74  LT clause into t
fce0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 70 70 72  he.      ** appr
fcf0: 6f 70 72 69 61 74 65 20 54 4b 5f 54 52 55 45 46  opriate TK_TRUEF
fd00: 41 4c 53 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ALSE operator */
fd10: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
fd20: 65 33 45 78 70 72 49 64 54 6f 54 72 75 65 46 61  e3ExprIdToTrueFa
fd30: 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
fd40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
fd50: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
fd60: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
fd70: 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
fd80: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
fd90: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
fda0: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
fdb0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
fdc0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
fdd0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
fde0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
fdf0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
fe00: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
fe10: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fe20: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
fe30: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
fe40: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
fe50: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
fe60: 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
fe70: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
fe80: 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20  r, EP_FixedCol) 
fe90: 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  && pWalker->eCod
fea0: 65 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=2 ){.        
feb0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
fec0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
fed0: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
fee0: 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78 70  eCode==3 && pExp
fef0: 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
ff00: 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20  er->u.iCur ){.  
ff10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
ff20: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
ff30: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
ff40: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20   through */.    
ff50: 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  case TK_IF_NULL_
ff60: 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ROW:.    case TK
ff70: 5f 52 45 47 49 53 54 45 52 3a 0a 20 20 20 20 20  _REGISTER:.     
ff80: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
ff90: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
ffa0: 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
ffb0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
ffc0: 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29  TK_IF_NULL_ROW )
ffd0: 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d  ;.      pWalker-
ffe0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
fff0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
10000 72 74 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  rt;.    case TK_
10010 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
10020 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
10030 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  de==5 ){.       
10040 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e   /* Silently con
10050 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72 61 6d  vert bound param
10060 65 74 65 72 73 20 74 68 61 74 20 61 70 70 65 61  eters that appea
10070 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52 45 41  r inside of CREA
10080 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  TE.        ** st
10090 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20  atements into a 
100a0 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73 69 6e  NULL when parsin
100b0 67 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  g the CREATE sta
100c0 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75 74 0a  tement text out.
100d0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
100e0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
100f0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
10100 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
10110 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  NULL;.      }els
10120 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65  e if( pWalker->e
10130 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20  Code==4 ){.     
10140 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61     /* A bound pa
10150 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43 52 45  rameter in a CRE
10160 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ATE statement th
10170 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
10180 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71  om.        ** sq
10190 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
101a0 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72 20  causes an error 
101b0 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  */.        pWalk
101c0 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
101d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
101e0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
101f0 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
10200 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64 65  hrough */.    de
10210 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73  fault:.      tes
10220 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
10230 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f  ==TK_SELECT ); /
10240 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  * sqlite3SelectW
10250 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61 6c 6c  alkFail() disall
10260 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  ows */.      tes
10270 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
10280 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f  ==TK_EXISTS ); /
10290 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  * sqlite3SelectW
102a0 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61 6c 6c  alkFail() disall
102b0 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ows */.      ret
102c0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
102d0 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69  ;.  }.}.static i
102e0 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45  nt exprIsConst(E
102f0 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74  xpr *p, int init
10300 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29 7b  Flag, int iCur){
10310 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
10320 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61  .eCode = initFla
10330 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  g;.  w.xExprCall
10340 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49  back = exprNodeI
10350 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78  sConstant;.  w.x
10360 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
10370 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
10380 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20 53  lkFail;.#ifdef S
10390 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77 2e  QLITE_DEBUG.  w.
103a0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
103b0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
103c0 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e  WalkAssert2;.#en
103d0 64 69 66 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d  dif.  w.u.iCur =
103e0 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33   iCur;.  sqlite3
103f0 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
10400 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
10410 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
10420 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
10430 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
10440 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
10450 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
10460 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
10470 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
10480 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
10490 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
104a0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
104b0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
104c0 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
104d0 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
104e0 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
104f0 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
10500 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
10510 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
10520 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
10530 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
10540 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
10550 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
10560 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
10570 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a  Const(p, 1, 0);.
10580 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
10590 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
105a0 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
105b0 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20 20 28 31  ro if.**.**   (1
105c0 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  ) the expression
105d0 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 61 6e   is constant, an
105e0 64 0a 2a 2a 20 20 20 28 32 29 20 74 68 65 20 65  d.**   (2) the e
105f0 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6f  xpression does o
10600 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
10610 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
10620 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61  se.**       of a
10630 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 0a   LEFT JOIN, and.
10640 2a 2a 20 20 20 28 33 29 20 74 68 65 20 65 78 70  **   (3) the exp
10650 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
10660 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 45 50 5f   contain any EP_
10670 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43 4f 4c 55  FixedCol TK_COLU
10680 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f 70 65 72  MN.**       oper
10690 61 6e 64 73 20 63 72 65 61 74 65 64 20 62 79 20  ands created by 
106a0 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f  the constant pro
106b0 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a  pagation optimiz
106c0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ation..**.** Whe
106d0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
106e0 65 74 75 72 6e 73 20 74 72 75 65 2c 20 69 74 20  eturns true, it 
106f0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
10700 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
10710 20 63 61 6e 20 62 65 20 61 64 64 65 64 20 74 6f   can be added to
10720 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 43 6f   the pParse->pCo
10730 6e 73 74 45 78 70 72 20 6c 69 73 74 20 61 6e 64  nstExpr list and
10740 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20   evaluated once 
10750 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 72 65 70  when.** the prep
10760 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 73  ared statement s
10770 74 61 72 74 73 20 75 70 2e 20 20 53 65 65 20 73  tarts up.  See s
10780 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
10790 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  Init()..*/.int s
107a0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
107b0 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72  tantNotJoin(Expr
107c0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
107d0 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c  xprIsConst(p, 2,
107e0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   0);.}../*.** Wa
107f0 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
10800 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
10810 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
10820 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
10830 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79  stant.** for any
10840 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
10850 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
10860 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f  rsor iCur.  In o
10870 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a  ther words, the.
10880 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  ** expression mu
10890 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  st not refer to 
108a0 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  any non-determin
108b0 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e  istic function n
108c0 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20  or any.** table 
108d0 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e  other than iCur.
108e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
108f0 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
10900 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  nt(Expr *p, int 
10910 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  iCur){.  return 
10920 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
10930 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , iCur);.}.../*.
10940 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ** sqlite3WalkEx
10950 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73  pr() callback us
10960 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  ed by sqlite3Exp
10970 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  rIsConstantOrGro
10980 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  upBy()..*/.stati
10990 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
109a0 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
109b0 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  y(Walker *pWalke
109c0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
109d0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
109e0 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b 65 72 2d  oupBy = pWalker-
109f0 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69  >u.pGroupBy;.  i
10a00 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  nt i;..  /* Chec
10a10 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 69 64  k if pExpr is id
10a20 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79 20 47  entical to any G
10a30 52 4f 55 50 20 42 59 20 74 65 72 6d 2e 20 49 66  ROUP BY term. If
10a40 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a 20 20   so, consider.  
10a50 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74 2e 20  ** it constant. 
10a60 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
10a70 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
10a80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
10a90 20 2a 70 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e   *p = pGroupBy->
10aa0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
10ab0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
10ac0 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72 2c  ompare(0, pExpr,
10ad0 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20   p, -1)<2 ){.   
10ae0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
10af0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e  l = sqlite3ExprN
10b00 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72  NCollSeq(pWalker
10b10 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  ->pParse, p);.  
10b20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
10b30 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c 29 20 29  sBinary(pColl) )
10b40 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
10b50 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
10b60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10b70 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78   /* Check if pEx
10b80 70 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  pr is a sub-sele
10b90 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69  ct. If so, consi
10ba0 64 65 72 20 69 74 20 76 61 72 69 61 62 6c 65 2e  der it variable.
10bb0 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61   */.  if( ExprHa
10bc0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
10bd0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
10be0 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
10bf0 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65  Code = 0;.    re
10c00 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
10c10 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 65 78    }..  return ex
10c20 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
10c30 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29  (pWalker, pExpr)
10c40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
10c50 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
10c60 72 65 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ree passed as th
10c70 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
10c80 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  . Return non-zer
10c90 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72  o.** if the expr
10ca0 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20  ession consists 
10cb0 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73  entirely of cons
10cc0 74 61 6e 74 73 20 6f 72 20 63 6f 70 69 65 73 20  tants or copies 
10cd0 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20  of terms .** in 
10ce0 70 47 72 6f 75 70 42 79 20 74 68 61 74 20 73 6f  pGroupBy that so
10cf0 72 74 20 77 69 74 68 20 74 68 65 20 42 49 4e 41  rt with the BINA
10d00 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  RY collation seq
10d10 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  uence..**.** Thi
10d20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
10d30 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
10d40 66 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  f a term of the 
10d50 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 63 61  HAVING clause ca
10d60 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64  n.** be promoted
10d70 20 69 6e 74 6f 20 74 68 65 20 57 48 45 52 45 20   into the WHERE 
10d80 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64 65  clause.  In orde
10d90 72 20 66 6f 72 20 73 75 63 68 20 61 20 70 72 6f  r for such a pro
10da0 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a  motion to work,.
10db0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
10dc0 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
10dd0 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74  e term must be t
10de0 68 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20  he same for all 
10df0 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20  members of.** a 
10e00 22 67 72 6f 75 70 22 2e 20 20 54 68 65 20 72 65  "group".  The re
10e10 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
10e20 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
10e30 20 6d 75 73 74 20 62 65 20 42 49 4e 41 52 59 0a   must be BINARY.
10e40 2a 2a 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ** assumes that 
10e50 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69  no other collati
10e60 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  ng sequence will
10e70 20 68 61 76 65 20 61 20 66 69 6e 65 72 2d 67 72   have a finer-gr
10e80 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e  ained.** groupin
10e90 67 20 74 68 61 6e 20 62 69 6e 61 72 79 2e 20 20  g than binary.  
10ea0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 28  In other words (
10eb0 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61  A=B COLLATE bina
10ec0 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41  ry) implies.** A
10ed0 3d 42 20 69 6e 20 65 76 65 72 79 20 6f 74 68 65  =B in every othe
10ee0 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  r collating sequ
10ef0 65 6e 63 65 2e 20 20 54 68 65 20 72 65 71 75 69  ence.  The requi
10f00 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 0a  rement that the.
10f10 2a 2a 20 47 52 4f 55 50 20 42 59 20 62 65 20 42  ** GROUP BY be B
10f20 49 4e 41 52 59 20 69 73 20 73 74 72 69 63 74 65  INARY is stricte
10f30 72 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  r than necessary
10f40 2e 20 20 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f  .  It would also
10f50 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d   work.** to prom
10f60 6f 74 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  ote HAVING claus
10f70 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
10f80 73 61 6d 65 20 61 6c 74 65 72 6e 61 74 69 76 65  same alternative
10f90 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
10fa0 71 75 65 6e 63 65 20 61 73 20 74 68 65 20 47 52  quence as the GR
10fb0 4f 55 50 20 42 59 20 74 65 72 6d 2c 20 62 75 74  OUP BY term, but
10fc0 20 74 68 61 74 20 69 73 20 6d 75 63 68 20 68 61   that is much ha
10fd0 72 64 65 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a  rder to check,.*
10fe0 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * alternative co
10ff0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11000 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20  s are uncommon, 
11010 61 6e 64 20 74 68 69 73 20 69 73 20 6f 6e 6c 79  and this is only
11020 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74   an.** optimizat
11030 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b 65 20  ion, so we take 
11040 74 68 65 20 65 61 73 79 20 77 61 79 20 6f 75 74  the easy way out
11050 20 61 6e 64 20 73 69 6d 70 6c 79 20 72 65 71 75   and simply requ
11060 69 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50  ire the.** GROUP
11070 20 42 59 20 74 6f 20 75 73 65 20 74 68 65 20 42   BY to use the B
11080 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20  INARY collating 
11090 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74  sequence..*/.int
110a0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
110b0 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28  nstantOrGroupBy(
110c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
110d0 78 70 72 20 2a 70 2c 20 45 78 70 72 4c 69 73 74  xpr *p, ExprList
110e0 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20 20 57   *pGroupBy){.  W
110f0 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
11100 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
11110 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
11120 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72  NodeIsConstantOr
11130 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78 53 65  GroupBy;.  w.xSe
11140 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30  lectCallback = 0
11150 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70 42 79  ;.  w.u.pGroupBy
11160 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 77   = pGroupBy;.  w
11170 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
11180 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
11190 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
111a0 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a  turn w.eCode;.}.
111b0 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
111c0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
111d0 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
111e0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
111f0 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
11200 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20  * or a function 
11210 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61  call with consta
11220 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
11230 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74  eturn and 0 if t
11240 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20  here.** are any 
11250 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
11260 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
11270 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
11280 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
11290 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
112a0 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
112b0 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
112c0 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
112d0 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
112e0 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
112f0 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
11300 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
11310 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
11320 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69  on(Expr *p, u8 i
11330 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74  sInit){.  assert
11340 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69  ( isInit==0 || i
11350 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65  sInit==1 );.  re
11360 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
11370 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29  (p, 4+isInit, 0)
11380 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
11390 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
113a0 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c  _HINTS./*.** Wal
113b0 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
113c0 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
113d0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
113e0 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  n contains a.** 
113f0 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65  subquery of some
11400 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30   kind.  Return 0
11410 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
11420 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a   subqueries..*/.
11430 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
11440 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79 28  ontainsSubquery(
11450 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b  Expr *p){.  Walk
11460 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
11470 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  = 1;.  w.xExprCa
11480 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
11490 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  ExprWalkNoop;.  
114a0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
114b0 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
114c0 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65  tWalkFail;.#ifde
114d0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
114e0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
114f0 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ck2 = sqlite3Sel
11500 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a  ectWalkAssert2;.
11510 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
11520 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
11530 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
11540 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  e==0;.}.#endif..
11550 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
11560 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20  ression p codes 
11570 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
11580 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  er that is small
11590 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69   enough.** to fi
115a0 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  t in a 32-bit in
115b0 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20  teger, return 1 
115c0 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75  and put the valu
115d0 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
115e0 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20  .** in *pValue. 
115f0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
11600 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  on is not an int
11610 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73  eger or if it is
11620 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66   too big.** to f
11630 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  it in a signed 3
11640 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
11650 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76  eturn 0 and leav
11660 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e  e *pValue unchan
11670 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
11680 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
11690 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
116a0 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63  Value){.  int rc
116b0 20 3d 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45   = 0;.  if( NEVE
116c0 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
116d0 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20   0;  /* Used to 
116e0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c  only happen foll
116f0 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a  owing on OOM */.
11700 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72  .  /* If an expr
11710 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74  ession is an int
11720 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61  eger literal tha
11730 74 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e  t fits in a sign
11740 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69  ed 32-bit.  ** i
11750 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65  nteger, then the
11760 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
11770 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  g will have alre
11780 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a  ady been set */.
11790 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
117a0 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28  =TK_INTEGER || (
117b0 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
117c0 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20  tValue)!=0.     
117d0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
117e0 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54  GetInt32(p->u.zT
117f0 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b  oken, &rc)==0 );
11800 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ..  if( p->flags
11810 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
11820 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20  {.    *pValue = 
11830 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  p->u.iValue;.   
11840 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
11850 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
11860 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  {.    case TK_UP
11870 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  LUS: {.      rc 
11880 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  = sqlite3ExprIsI
11890 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
118a0 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   pValue);.      
118b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
118c0 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
118d0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
118e0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
118f0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
11900 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
11910 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11920 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d  v!=(-2147483647-
11930 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  1) );.        *p
11940 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20  Value = -v;.    
11950 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
11960 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
11970 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
11980 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  lt: break;.  }. 
11990 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
119a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  *.** Return FALS
119b0 45 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  E if there is no
119c0 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
119d0 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
119e0 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  be NULL..**.** I
119f0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
11a00 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f   might be NULL o
11a10 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  r if the express
11a20 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c  ion is too compl
11a30 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65  ex.** to tell re
11a40 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a  turn TRUE.  .**.
11a50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11a60 69 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70  is used as an op
11a70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73  timization, to s
11a80 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70  kip OP_IsNull op
11a90 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65  codes.** when we
11aa0 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c   know that a val
11ab0 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  ue cannot be NUL
11ac0 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c  L.  Hence, a fal
11ad0 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28  se positive.** (
11ae0 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77  returning TRUE w
11af0 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20  hen in fact the 
11b00 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e  expression can n
11b10 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69  ever be NULL) mi
11b20 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c  ght.** be a smal
11b30 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  l performance hi
11b40 74 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  t but is otherwi
11b50 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e  se harmless.  On
11b60 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61   the other.** ha
11b70 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61  nd, a false nega
11b80 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20  tive (returning 
11b90 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72  FALSE when the r
11ba0 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e  esult could be N
11bb0 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b  ULL).** will lik
11bc0 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ely result in an
11bd0 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65   incorrect answe
11be0 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64  r.  So when in d
11bf0 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  oubt, return.** 
11c00 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  TRUE..*/.int sql
11c10 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
11c20 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29  l(const Expr *p)
11c30 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69  {.  u8 op;.  whi
11c40 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
11c50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LUS || p->op==TK
11c60 5f 55 4d 49 4e 55 53 20 29 7b 0a 20 20 20 20 70  _UMINUS ){.    p
11c70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d   = p->pLeft;.  }
11c80 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
11c90 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
11ca0 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
11cb0 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
11cc0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
11cd0 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
11ce0 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
11cf0 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
11d00 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
11d10 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
11d20 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
11d30 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 72 65 74 75  LUMN:.      retu
11d40 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  rn ExprHasProper
11d50 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75  ty(p, EP_CanBeNu
11d60 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ll) ||.         
11d70 20 20 20 20 70 2d 3e 79 2e 70 54 61 62 3d 3d 30      p->y.pTab==0
11d80 20 7c 7c 20 20 2f 2a 20 52 65 66 65 72 65 6e 63   ||  /* Referenc
11d90 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  e to column of i
11da0 6e 64 65 78 20 6f 6e 20 65 78 70 72 65 73 73 69  ndex on expressi
11db0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
11dc0 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d     (p->iColumn>=
11dd0 30 20 26 26 20 70 2d 3e 79 2e 70 54 61 62 2d 3e  0 && p->y.pTab->
11de0 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d  aCol[p->iColumn]
11df0 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20  .notNull==0);.  
11e00 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
11e10 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
11e20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
11e30 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
11e40 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
11e50 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20   constant which 
11e60 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68  would be.** unch
11e70 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69  anged by OP_Affi
11e80 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66  nity with the af
11e90 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20  finity given in 
11ea0 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
11eb0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
11ec0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
11ed0 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
11ee0 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  if the OP_Affini
11ef0 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ty operation.** 
11f00 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
11f10 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72   When in doubt r
11f20 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20  eturn FALSE.  A 
11f30 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a  false negative.*
11f40 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  * is harmless.  
11f50 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  A false positive
11f60 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72  , however, can r
11f70 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f  esult in the wro
11f80 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f  ng.** answer..*/
11f90 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11fa0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
11fb0 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72  hange(const Expr
11fc0 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a   *p, char aff){.
11fd0 20 20 75 38 20 6f 70 3b 0a 20 20 69 6e 74 20 75    u8 op;.  int u
11fe0 6e 61 72 79 4d 69 6e 75 73 20 3d 20 30 3b 0a 20  naryMinus = 0;. 
11ff0 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45   if( aff==SQLITE
12000 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75  _AFF_BLOB ) retu
12010 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 1;.  while( p
12020 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
12030 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
12040 55 53 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  US ){.    if( p-
12050 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
12060 20 75 6e 61 72 79 4d 69 6e 75 73 20 3d 20 31 3b   unaryMinus = 1;
12070 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66  .    p = p->pLef
12080 74 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  t;.  }.  op = p-
12090 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
120a0 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
120b0 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
120c0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
120d0 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
120e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
120f0 66 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f>=SQLITE_AFF_NU
12100 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
12110 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
12120 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
12130 66 66 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff>=SQLITE_AFF_N
12140 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
12150 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
12160 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
12170 20 21 75 6e 61 72 79 4d 69 6e 75 73 20 26 26 20   !unaryMinus && 
12180 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
12190 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TEXT;.    }.    
121a0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
121b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 21 75 6e        return !un
121c0 61 72 79 4d 69 6e 75 73 3b 0a 20 20 20 20 7d 0a  aryMinus;.    }.
121d0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
121e0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  MN: {.      asse
121f0 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30  rt( p->iTable>=0
12200 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74   );  /* p cannot
12210 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48   be part of a CH
12220 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ECK constraint *
12230 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  /.      return a
12240 66 66 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff>=SQLITE_AFF_N
12250 55 4d 45 52 49 43 20 26 26 20 70 2d 3e 69 43 6f  UMERIC && p->iCo
12260 6c 75 6d 6e 3c 30 3b 0a 20 20 20 20 7d 0a 20 20  lumn<0;.    }.  
12270 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
12280 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
12290 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
122a0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
122b0 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
122c0 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75  is a row-id colu
122d0 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  mn name..*/.int 
122e0 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63  sqlite3IsRowid(c
122f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
12300 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
12310 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
12320 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
12330 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
12340 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  rICmp(z, "ROWID"
12350 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
12360 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
12370 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d  rICmp(z, "OID")=
12380 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
12390 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
123a0 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20 52 48  .** pX is the RH
123b0 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  S of an IN opera
123c0 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73 20 61  tor.  If pX is a
123d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
123e0 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62  t .** that can b
123f0 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20  e simplified to 
12400 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 61  a direct table a
12410 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75  ccess, then retu
12420 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
12430 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  to the SELECT st
12440 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20  atement.  If pX 
12450 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  is not a SELECT 
12460 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72  statement,.** or
12470 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   if the SELECT s
12480 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74  tatement needs t
12490 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20  o be manifested 
124a0 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74  into a transient
124b0 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  .** table, then 
124c0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
124d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
124e0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61  MIT_SUBQUERY.sta
124f0 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61  tic Select *isCa
12500 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
12510 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c  Expr *pX){.  Sel
12520 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73  ect *p;.  SrcLis
12530 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
12540 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
12550 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
12560 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72  t i;.  if( !Expr
12570 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
12580 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20  EP_xIsSelect) ) 
12590 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f  return 0;  /* No
125a0 74 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  t a subquery */.
125b0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
125c0 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72  perty(pX, EP_Var
125d0 53 65 6c 65 63 74 29 20 20 29 20 72 65 74 75 72  Select)  ) retur
125e0 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61  n 0;  /* Correla
125f0 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20  ted subq */.  p 
12600 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  = pX->x.pSelect;
12610 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
12620 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
12630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
12640 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
12650 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  CT */.  if( p->s
12660 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
12670 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
12680 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74  ate) ){.    test
12690 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
126a0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
126b0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
126c0 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
126d0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
126e0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
126f0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
12700 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
12710 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72  gregate );.    r
12720 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44  eturn 0; /* No D
12730 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
12740 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65  and no aggregate
12750 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
12760 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
12770 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20  GroupBy==0 );   
12780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
12790 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
127a0 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
127b0 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
127c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
127d0 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54   /* Has no LIMIT
127e0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
127f0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
12800 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12810 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48      /* Has no WH
12820 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
12830 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
12840 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
12850 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  0 );.  if( pSrc-
12860 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
12870 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
12880 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   Single term in 
12890 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
128a0 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
128b0 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
128c0 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20   0;     /* FROM 
128d0 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  is not a subquer
128e0 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70  y or view */.  p
128f0 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
12900 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  .pTab;.  assert(
12910 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
12920 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c  sert( pTab->pSel
12930 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ect==0 );       
12940 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
12950 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65  use is not a vie
12960 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72  w */.  if( IsVir
12970 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
12980 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  urn 0;        /*
12990 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74   FROM clause not
129a0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
129b0 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
129c0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65  ->pEList;.  asse
129d0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
129e0 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54  .  /* All SELECT
129f0 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65   results must be
12a00 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66   columns. */.  f
12a10 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
12a20 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12a30 20 20 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20     Expr *pRes = 
12a40 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
12a50 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73  pr;.    if( pRes
12a60 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
12a70 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
12a80 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54  assert( pRes->iT
12a90 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d  able==pSrc->a[0]
12aa0 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20  .iCursor );  /* 
12ab0 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64  Not a correlated
12ac0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d   subquery */.  }
12ad0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23  .  return p;.}.#
12ae0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12af0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
12b00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12b10 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
12b20 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12b30 64 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74  de that checks t
12b40 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  he left-most col
12b50 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62  umn of index tab
12b60 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69  le iCur to see i
12b70 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73  f.** it contains
12b80 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65   any NULL entrie
12b90 73 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65  s.  Cause the re
12ba0 67 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73  gister at regHas
12bb0 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a  Null to be set.*
12bc0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * to a non-NULL 
12bd0 76 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f  value if iCur co
12be0 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e  ntains no NULLs.
12bf0 20 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72    Cause register
12c00 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74   regHasNull.** t
12c10 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  o be set to NULL
12c20 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
12c30 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
12c40 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  LL values..*/.st
12c50 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
12c60 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
12c70 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75  Vdbe *v, int iCu
12c80 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c  r, int regHasNul
12c90 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b  l){.  int addr1;
12ca0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12cb0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
12cc0 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  er, 0, regHasNul
12cd0 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  l);.  addr1 = sq
12ce0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
12cf0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
12d00 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
12d10 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
12d20 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12d30 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c  Column, iCur, 0,
12d40 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
12d50 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
12d60 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
12d70 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65  PEOFARG);.  Vdbe
12d80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72  Comment((v, "fir
12d90 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22  st_entry_in(%d)"
12da0 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69  , iCur));.  sqli
12db0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
12dc0 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e  v, addr1);.}.#en
12dd0 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
12de0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
12df0 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  RY./*.** The arg
12e00 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f  ument is an IN o
12e10 70 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c  perator with a l
12e20 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75  ist (not a subqu
12e30 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ery) on the .** 
12e40 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e  right-hand side.
12e50 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
12e60 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f   that list is co
12e70 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  nstant..*/.stati
12e80 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52  c int sqlite3InR
12e90 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70  hsIsConstant(Exp
12ea0 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20  r *pIn){.  Expr 
12eb0 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73  *pLHS;.  int res
12ec0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
12ed0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e  rHasProperty(pIn
12ee0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
12ef0 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d  );.  pLHS = pIn-
12f00 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70  >pLeft;.  pIn->p
12f10 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20  Left = 0;.  res 
12f20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  = sqlite3ExprIsC
12f30 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20  onstant(pIn);.  
12f40 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48  pIn->pLeft = pLH
12f50 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  S;.  return res;
12f60 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
12f70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12f80 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d  s used by the im
12f90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
12fa0 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65  the IN (...) ope
12fb0 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58  rator..** The pX
12fc0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
12fd0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20  e expression on 
12fe0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12ff0 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63  N operator, whic
13000 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69  h.** might be ei
13010 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65  ther a list of e
13020 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20  xpressions or a 
13030 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
13040 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
13050 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69  routine is to fi
13060 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
13070 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61  -tree object tha
13080 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  t can.** be used
13090 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20   either to test 
130a0 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69  for membership i
130b0 6e 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72  n the RHS set or
130c0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
130d0 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65  ugh.** all membe
130e0 72 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65  rs of the RHS se
130f0 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c  t, skipping dupl
13100 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  icates..**.** A 
13110 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
13120 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f   on the b-tree o
13130 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68  bject that is th
13140 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
13150 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20  operator.** and 
13160 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65  pX->iTable is se
13170 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
13180 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a  f that cursor..*
13190 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
131a0 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  d value of this 
131b0 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74  function indicat
131c0 65 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79  es the b-tree ty
131d0 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  pe, as follows:.
131e0 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  **.**   IN_INDEX
131f0 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68  _ROWID      - Th
13200 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
13210 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
13220 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  e table..**   IN
13230 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
13240 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
13250 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  as opened on an 
13260 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  ascending index.
13270 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
13280 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20  NDEX_DESC - The 
13290 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
132a0 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  d on a descendin
132b0 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
132c0 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20  _INDEX_EPH      
132d0 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
132e0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73  as opened on a s
132f0 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64  pecially created
13300 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
13310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13320 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65  populated ephere
13330 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  mal table..**   
13340 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20  IN_INDEX_NOOP   
13350 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20      - No cursor 
13360 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20  was allocated.  
13370 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  The IN operator 
13380 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20  must be.**      
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133a0 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61     implemented a
133b0 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  s a sequence of 
133c0 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a  comparisons..**.
133d0 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62  ** An existing b
133e0 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75  -tree might be u
133f0 73 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65  sed if the RHS e
13400 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20  xpression pX is 
13410 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71  a simple.** subq
13420 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a  uery such as:.**
13430 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
13440 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d  column1>, <colum
13450 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62  n2>... FROM <tab
13460 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le>.**.** If the
13470 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
13480 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
13490 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70  t or a more comp
134a0 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20 74 68  lex subquery, th
134b0 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72  en.** an ephemer
134c0 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e  al table might n
134d0 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61  eed to be genera
134e0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53  ted from the RHS
134f0 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d   and then.** pX-
13500 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20  >iTable made to 
13510 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68  point to the eph
13520 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73  emeral table ins
13530 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78  tead of an.** ex
13540 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a  isting table..**
13550 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20  .** The inFlags 
13560 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63  parameter must c
13570 6f 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e  ontain, at a min
13580 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65  imum, one of the
13590 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45   bits.** IN_INDE
135a0 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20  X_MEMBERSHIP or 
135b0 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75  IN_INDEX_LOOP bu
135c0 74 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49 66 20  t not both.  If 
135d0 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73  inFlags contains
135e0 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
135f0 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68  BERSHIP, then th
13600 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c  e generated tabl
13610 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  e will be used f
13620 6f 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d  or a fast.** mem
13630 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57  bership test.  W
13640 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58  hen the IN_INDEX
13650 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74  _LOOP bit is set
13660 2c 20 74 68 65 20 49 4e 20 69 6e 64 65 78 20 77  , the IN index w
13670 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  ill.** be used t
13680 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  o loop over all 
13690 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48  values of the RH
136a0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
136b0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ator..**.** When
136c0 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69   IN_INDEX_LOOP i
136d0 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
136e0 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
136f0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a  sed to iterate.*
13700 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65  * through the se
13710 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20  t members) then 
13720 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20  the b-tree must 
13730 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c  not contain dupl
13740 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70  icates..** An ep
13750 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 77 69  heremal table wi
13760 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 75 6e  ll be created un
13770 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65  less the selecte
13780 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75  d columns are gu
13790 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
137a0 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65  e unique - eithe
137b0 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
137c0 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
137d0 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f  RY KEY or due to
137e0 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e  .** a UNIQUE con
137f0 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78  straint or index
13800 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
13810 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
13820 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
13830 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
13840 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
13850 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
13860 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e  p tests) then an
13870 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
13880 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
13890 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
138a0 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49  s> is a single I
138b0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
138c0 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20  EY column or an 
138d0 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65  .** index can be
138e0 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20   found with the 
138f0 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d  specified <colum
13900 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  ns> as its left-
13910 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  most..**.** If t
13920 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  he IN_INDEX_NOOP
13930 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58  _OK and IN_INDEX
13940 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20  _MEMBERSHIP are 
13950 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20  both set and.** 
13960 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  if the RHS of th
13970 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
13980 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73   a list (not a s
13990 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68  ubquery) then th
139a0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69  is.** routine mi
139b0 67 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20  ght decide that 
139c0 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65  creating an ephe
139d0 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72  meral b-tree for
139e0 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74   membership.** t
139f0 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78  esting is too ex
13a00 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75  pensive and retu
13a10 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  rn IN_INDEX_NOOP
13a20 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
13a30 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   the.** calling 
13a40 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69  routine should i
13a50 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20  mplement the IN 
13a60 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61  operator using a
13a70 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20   sequence.** of 
13a80 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69  Eq or Ne compari
13a90 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  son operations..
13aa0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62  **.** When the b
13ab0 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75  -tree is being u
13ac0 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  sed for membersh
13ad0 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61  ip tests, the ca
13ae0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
13af0 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  * might need to 
13b00 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
13b10 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65  not the RHS side
13b20 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
13b30 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  tor.** contains 
13b40 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68  a NULL.  If prRh
13b50 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20  sHasNull is not 
13b60 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61  a NULL pointer a
13b70 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  nd .** if there 
13b80 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68  is any chance th
13b90 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67  at the (...) mig
13ba0 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c  ht contain a NUL
13bb0 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75  L value at.** ru
13bc0 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65  ntime, then a re
13bd0 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61  gister is alloca
13be0 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69  ted and the regi
13bf0 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74  ster number writ
13c00 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73  ten.** to *prRhs
13c10 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72  HasNull. If ther
13c20 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
13c30 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f  hat the (...) co
13c40 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c  ntains a.** NULL
13c50 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72   value, then *pr
13c60 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65  RhsHasNull is le
13c70 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
13c80 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
13c90 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
13ca0 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20  nd its location 
13cb0 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73  stored in *prRhs
13cc0 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a  HasNull, then.**
13cd0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
13ce0 61 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c  at register will
13cf0 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   be NULL if the 
13d00 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20  b-tree contains 
13d10 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e  one or more.** N
13d20 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20  ULL values, and 
13d30 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20  it will be some 
13d40 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
13d50 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
13d60 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c  tains no.** NULL
13d70 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   values..**.** I
13d80 66 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61  f the aiMap para
13d90 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  meter is not NUL
13da0 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74  L, it must point
13db0 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e   to an array con
13dc0 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65  taining.** one e
13dd0 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20  lement for each 
13de0 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20  column returned 
13df0 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  by the SELECT st
13e00 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52  atement on the R
13e10 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28  HS.** of the IN(
13e20 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54  ...) operator. T
13e30 68 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66  he i'th entry of
13e40 20 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f   the array is po
13e50 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
13e60 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68  .** offset of th
13e70 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74  e index column t
13e80 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
13e90 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75  i'th column retu
13ea0 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53  rned by the.** S
13eb0 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70  ELECT. For examp
13ec0 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  le, if the expre
13ed0 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  ssion and select
13ee0 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a  ed index are:.**
13ef0 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e  .**   (?,?,?) IN
13f00 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63   (SELECT a, b, c
13f10 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43   FROM t1).**   C
13f20 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
13f30 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a  N t1(b, c, a);.*
13f40 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b  *.** then aiMap[
13f50 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  ] is populated w
13f60 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a  ith {2, 0, 1}..*
13f70 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13f80 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
13f90 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
13fa0 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
13fb0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
13fc0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
13fd0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
13fe0 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20   *pX,           
13ff0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
14000 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
14010 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20 20   u32 inFlags,   
14020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14030 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d  N_INDEX_LOOP, _M
14040 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f  EMBERSHIP, and/o
14050 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20  r _NOOP_OK */.  
14060 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  int *prRhsHasNul
14070 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  l,         /* Re
14080 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e  gister holding N
14090 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65 65  ULL status.  See
140a0 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   notes */.  int 
140b0 2a 61 69 4d 61 70 2c 20 20 20 20 20 20 20 20 20  *aiMap,         
140c0 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
140d0 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69 65  g from Index fie
140e0 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c 64  lds to RHS field
140f0 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  s */.  int *piTa
14100 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b               
14110 20 20 2f 2a 20 4f 55 54 3a 20 69 6e 64 65 78 20    /* OUT: index 
14120 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 53  to use */.){.  S
14130 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20  elect *p;       
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14150 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74       /* SELECT t
14160 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49  o the right of I
14170 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
14180 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20  int eType = 0;  
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
141b0 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49   RHS table. IN_I
141c0 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20  NDEX_* */.  int 
141d0 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
141e0 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  Tab++;          
141f0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74    /* Cursor of t
14200 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a  he RHS table */.
14210 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71    int mustBeUniq
14220 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
14230 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
14240 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75  if RHS must be u
14250 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20  nique */.  Vdbe 
14260 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
14270 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
14280 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68   /* Virtual mach
14290 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ine being coded 
142a0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58  */..  assert( pX
142b0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
142c0 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20   mustBeUnique = 
142d0 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e  (inFlags & IN_IN
142e0 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20  DEX_LOOP)!=0;.. 
142f0 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f   /* If the RHS o
14300 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f  f this IN(...) o
14310 70 65 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c  perator is a SEL
14320 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d  ECT, and if it m
14330 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65  atters .  ** whe
14340 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
14350 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f  SELECT result co
14360 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
14370 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65  es, check whethe
14380 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55  r.  ** or not NU
14390 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70  LL is actually p
143a0 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20  ossible (it may 
143b0 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d  not be, for exam
143c0 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74  ple, due .  ** t
143d0 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  o NOT NULL const
143e0 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63  raints in the sc
143f0 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c  hema). If no NUL
14400 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73  L values are pos
14410 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20  sible,.  ** set 
14420 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20  prRhsHasNull to 
14430 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  0 before continu
14440 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
14450 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28  rRhsHasNull && (
14460 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pX->flags & EP_x
14470 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
14480 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72   int i;.    Expr
14490 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
144a0 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  X->x.pSelect->pE
144b0 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
144c0 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
144d0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
144e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
144f0 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d  anBeNull(pEList-
14500 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62  >a[i].pExpr) ) b
14510 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14520 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e  if( i==pEList->n
14530 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72  Expr ){.      pr
14540 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a  RhsHasNull = 0;.
14550 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14560 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
14570 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
14580 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62  e or index can b
14590 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73  e used to.  ** s
145a0 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79  atisfy the query
145b0 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65  .  This is prefe
145c0 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74  rable to generat
145d0 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20  ing a new .  ** 
145e0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
145f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
14600 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70  e->nErr==0 && (p
14610 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f   = isCandidateFo
14620 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29  rInOpt(pX))!=0 )
14630 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
14640 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14660 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
14670 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
14680 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c    /* Table <tabl
146b0 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69  e>. */.    i16 i
146c0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146e0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64    /* Database id
146f0 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  x for pTab */.  
14700 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
14710 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
14720 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
14730 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
14740 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14750 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
14760 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
14770 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
14780 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
14790 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
147a0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
147b0 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
147c0 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
147d0 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
147e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
147f0 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
14800 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
14810 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
14820 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
14830 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
14840 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
14850 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f      /* Code an O
14860 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  P_Transaction an
14870 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66  d OP_TableLock f
14880 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  or <table>. */. 
14890 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
148a0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
148b0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
148c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
148d0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
148e0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
148f0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
14900 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
14910 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
14920 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
14930 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a 20 73  assert(v);  /* s
14940 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
14950 68 61 73 20 61 6c 77 61 79 73 20 62 65 65 6e 20  has always been 
14960 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
14970 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 78  d */.    if( nEx
14980 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d  pr==1 && pEList-
14990 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[0].pExpr->iCo
149a0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
149b0 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28 53 45  /* The "x IN (SE
149c0 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
149d0 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a  table)" case */.
149e0 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
149f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14a00 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
14a10 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
14a20 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73  age(v);..      s
14a30 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
14a40 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
14a50 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
14a60 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79  Read);.      eTy
14a70 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
14a80 57 49 44 3b 0a 20 20 20 20 20 20 45 78 70 6c 61  WID;.      Expla
14a90 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
14aa0 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  rse, 0,.        
14ab0 20 20 20 20 22 55 53 49 4e 47 20 52 4f 57 49 44      "USING ROWID
14ac0 20 53 45 41 52 43 48 20 4f 4e 20 54 41 42 4c 45   SEARCH ON TABLE
14ad0 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41   %s FOR IN-OPERA
14ae0 54 4f 52 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65  TOR",pTab->zName
14af0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
14b00 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14b10 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
14b20 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
14b30 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14b50 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
14b60 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ble */.      int
14b70 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31   affinity_ok = 1
14b80 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a  ;.      int i;..
14b90 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
14ba0 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
14bb0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
14bc0 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61  ed to perform ea
14bd0 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  ch .      ** com
14be0 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
14bf0 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
14c00 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75  ity of each colu
14c10 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20 20  mn in table.    
14c20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53 20    ** on the RHS 
14c30 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
14c40 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c 20  or.  If it not, 
14c50 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
14c60 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75  le to.      ** u
14c70 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66 20  se any index of 
14c80 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20 20  the RHS table.  
14c90 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  */.      for(i=0
14ca0 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66 66  ; i<nExpr && aff
14cb0 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a  inity_ok; i++){.
14cc0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
14cd0 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  hs = sqlite3Vect
14ce0 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
14cf0 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  X->pLeft, i);.  
14d00 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
14d10 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
14d20 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
14d30 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66        char idxaf
14d40 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  f = sqlite3Table
14d50 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
14d60 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48  Tab,iCol); /* RH
14d70 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  S table */.     
14d80 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d     char cmpaff =
14d90 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
14da0 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64  ffinity(pLhs, id
14db0 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74  xaff);.        t
14dc0 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d  estcase( cmpaff=
14dd0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
14de0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
14df0 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
14e00 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b  LITE_AFF_TEXT );
14e10 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
14e20 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20   cmpaff ){.     
14e30 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
14e40 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  _AFF_BLOB:.     
14e50 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14e60 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
14e70 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
14e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
14e90 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
14ea0 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72  ity() only retur
14eb0 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73  ns TEXT if one s
14ec0 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20  ide or the.     
14ed0 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
14ee0 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20  has no affinity 
14ef0 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73 69  and the other si
14f00 64 65 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e  de is TEXT.  Hen
14f10 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ce,.            
14f20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  ** the only way 
14f30 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65  for cmpaff to be
14f40 20 54 45 58 54 20 69 73 20 66 6f 72 20 69 64 78   TEXT is for idx
14f50 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20  aff to be TEXT. 
14f60 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e             ** an
14f70 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f  d for the term o
14f80 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
14f90 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61   IN to have no a
14fa0 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
14fb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14fc0 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  idxaff==SQLITE_A
14fd0 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20  FF_TEXT );.     
14fe0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14ff0 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
15000 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66  .            aff
15010 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74  inity_ok = sqlit
15020 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
15030 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20  ity(idxaff);.   
15040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
15050 20 20 20 20 20 20 69 66 28 20 61 66 66 69 6e 69        if( affini
15060 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20  ty_ok ){.       
15070 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
15080 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78  n existing index
15090 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20   that will work 
150a0 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72  for this IN oper
150b0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
150c0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
150d0 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
150e0 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49  Type==0; pIdx=pI
150f0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
15100 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f        Bitmask co
15110 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 43  lUsed;      /* C
15120 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
15130 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  dex used */.    
15140 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 43        Bitmask mC
15150 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ol;         /* M
15160 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75 72 72  ask for the curr
15170 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ent column */.  
15180 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
15190 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20  ->nColumn<nExpr 
151a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
151b0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
151c0 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
151d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
151e0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
151f0 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53  m nColumn is BMS
15200 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73  -2, not BMS-1, s
15210 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 6f  o that we can co
15220 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20 20 20  mpute.          
15230 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70 72  ** BITMASK(nExpr
15240 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66 6c  ) without overfl
15250 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  owing */.       
15260 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64     testcase( pId
15270 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d  x->nColumn==BMS-
15280 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  2 );.          t
15290 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e  estcase( pIdx->n
152a0 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b  Column==BMS-1 );
152b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
152c0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d  Idx->nColumn>=BM
152d0 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  S-1 ) continue;.
152e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 75            if( mu
152f0 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20 20  stBeUnique ){.  
15300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
15310 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70  dx->nKeyCol>nExp
15320 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  r.             |
15330 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  |(pIdx->nColumn>
15340 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e 69 71  nExpr && !IsUniq
15350 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a 20  ueIndex(pIdx)). 
15360 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
15370 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
15380 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 69  inue;  /* This i
15390 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69 71  ndex is not uniq
153a0 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20 52  ue over the IN R
153b0 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  HS columns */.  
153c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
153d0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
153e0 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20 30       colUsed = 0
153f0 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f  ;   /* Columns o
15400 66 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f 20  f index used so 
15410 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  far */.         
15420 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
15430 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
15440 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
15450 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
15460 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
15470 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
15480 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 68         Expr *pRh
15490 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s = pEList->a[i]
154a0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
154b0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65      CollSeq *pRe
154c0 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  q = sqlite3Binar
154d0 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
154e0 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52  pParse, pLhs, pR
154f0 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  hs);.           
15500 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20   int j;.  .     
15510 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15520 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e  Req!=0 || pRhs->
15530 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49  iColumn==XN_ROWI
15540 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  D || pParse->nEr
15550 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
15560 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70   for(j=0; j<nExp
15570 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
15580 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
15590 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52  >aiColumn[j]!=pR
155a0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  hs->iColumn ) co
155b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
155c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
155d0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b  dx->azColl[j] );
155e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
155f0 66 28 20 70 52 65 71 21 3d 30 20 26 26 20 73 71  f( pReq!=0 && sq
15600 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65  lite3StrICmp(pRe
15610 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e  q->zName, pIdx->
15620 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b  azColl[j])!=0 ){
15630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15640 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
15650 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15660 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15670 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
15680 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
15690 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a  =nExpr ) break;.
156a0 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c              mCol
156b0 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20   = MASKBIT(j);. 
156c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d             if( m
156d0 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29 20  Col & colUsed ) 
156e0 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63  break; /* Each c
156f0 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20  olumn used only 
15700 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  once */.        
15710 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d      colUsed |= m
15720 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
15730 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d   if( aiMap ) aiM
15740 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20  ap[i] = j;.     
15750 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
15760 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
15770 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21  Expr || colUsed!
15780 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29  =(MASKBIT(nExpr)
15790 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  -1) );.         
157a0 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d   if( colUsed==(M
157b0 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
157c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
157d0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
157e0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
157f0 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78 20  means the index 
15800 70 49 64 78 20 69 73 20 75 73 61 62 6c 65 20 2a  pIdx is usable *
15810 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
15820 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
15830 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
15840 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
15850 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
15860 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
15870 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
15880 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
15890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158a0 20 22 55 53 49 4e 47 20 49 4e 44 45 58 20 25 73   "USING INDEX %s
158b0 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52   FOR IN-OPERATOR
158c0 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  ",pIdx->zName));
158d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
158e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
158f0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
15900 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
15910 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20   iDb);.         
15920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
15930 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
15940 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
15950 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
15960 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
15970 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
15980 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49         assert( I
15990 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
159a0 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  SC == IN_INDEX_I
159b0 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20  NDEX_ASC+1 );.  
159c0 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
159d0 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
159e0 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f  _ASC + pIdx->aSo
159f0 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20  rtOrder[0];.  . 
15a00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
15a10 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23  rRhsHasNull ){.#
15a20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15a30 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
15a40 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 20 20 20  MASK.           
15a50 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20 28 31     i64 mask = (1
15a60 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20 20 20  <<nExpr)-1;.    
15a70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15a80 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
15a90 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  v, OP_ColumnsUse
15aa0 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
15ab0 20 20 20 20 20 20 69 54 61 62 2c 20 30 2c 20 30        iTab, 0, 0
15ac0 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34  , (u8*)&mask, P4
15ad0 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a  _INT64);.#endif.
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
15af0 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b  rRhsHasNull = ++
15b00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15b10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15b20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
15b30 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15b40 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
15b50 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68  g(v, iTab, *prRh
15b60 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
15b70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15b80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15b90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15ba0 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
15bb0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
15bc0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64          } /* End
15bd0 20 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65 78   loop over index
15be0 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a  es */.      } /*
15bf0 20 45 6e 64 20 69 66 28 20 61 66 66 69 6e 69 74   End if( affinit
15c00 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20  y_ok ) */.    } 
15c10 2f 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e  /* End if not an
15c20 20 72 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a   rowid index */.
15c30 20 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d    } /* End attem
15c40 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75  pt to optimize u
15c50 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f  sing an index */
15c60 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65  ..  /* If no pre
15c70 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69  existing index i
15c80 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  s available for 
15c90 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20  the IN clause.  
15ca0 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  ** and IN_INDEX_
15cb0 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77  NOOP is an allow
15cc0 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e  ed reply.  ** an
15cd0 64 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  d the RHS of the
15ce0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
15cf0 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75  a list, not a su
15d00 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20  bquery.  ** and 
15d10 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63  the RHS is not c
15d20 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61 73 20 74  onstant or has t
15d30 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d  wo or fewer term
15d40 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20  s,.  ** then it 
15d50 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65  is not worth cre
15d60 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ating an ephemer
15d70 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c  al table to eval
15d80 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e  uate.  ** the IN
15d90 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74   operator so ret
15da0 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  urn IN_INDEX_NOO
15db0 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  P..  */.  if( eT
15dc0 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e  ype==0.   && (in
15dd0 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
15de0 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20  _NOOP_OK).   && 
15df0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15e00 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
15e10 74 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74  t).   && (!sqlit
15e20 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e  e3InRhsIsConstan
15e30 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70  t(pX) || pX->x.p
15e40 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a  List->nExpr<=2).
15e50 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d    ){.    eType =
15e60 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a   IN_INDEX_NOOP;.
15e70 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
15e80 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  ==0 ){.    /* Co
15e90 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20  uld not find an 
15ea0 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
15eb0 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61  r index to use a
15ec0 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65  s the RHS b-tree
15ed0 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c  ..    ** We will
15ee0 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74   have to generat
15ef0 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
15f00 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a  able to do the j
15f10 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ob..    */.    u
15f20 33 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  32 savedNQueryLo
15f30 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
15f40 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  eryLoop;.    int
15f50 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
15f60 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  0;.    eType = I
15f70 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20  N_INDEX_EPH;.   
15f80 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49   if( inFlags & I
15f90 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a  N_INDEX_LOOP ){.
15fa0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51        pParse->nQ
15fb0 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20  ueryLoop = 0;.  
15fc0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68    }else if( prRh
15fd0 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  sHasNull ){.    
15fe0 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
15ff0 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  = rMayHaveNull =
16000 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
16010 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
16020 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
16030 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
16040 6f 64 65 52 68 73 4f 66 49 4e 28 70 50 61 72 73  odeRhsOfIN(pPars
16050 65 2c 20 70 58 2c 20 69 54 61 62 29 3b 0a 20 20  e, pX, iTab);.  
16060 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75    if( rMayHaveNu
16070 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
16080 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
16090 67 28 76 2c 20 69 54 61 62 2c 20 72 4d 61 79 48  g(v, iTab, rMayH
160a0 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  aveNull);.    }.
160b0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
160c0 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51  ryLoop = savedNQ
160d0 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 0a 0a 20  ueryLoop;.  }.. 
160e0 20 69 66 28 20 61 69 4d 61 70 20 26 26 20 65 54   if( aiMap && eT
160f0 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype!=IN_INDEX_IN
16100 44 45 58 5f 41 53 43 20 26 26 20 65 54 79 70 65  DEX_ASC && eType
16110 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  !=IN_INDEX_INDEX
16120 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74  _DESC ){.    int
16130 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73   i, n;.    n = s
16140 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
16150 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b  Size(pX->pLeft);
16160 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
16170 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d  n; i++) aiMap[i]
16180 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 2a 70 69 54   = i;.  }.  *piT
16190 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 72 65 74  ab = iTab;.  ret
161a0 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e  urn eType;.}.#en
161b0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
161c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
161d0 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  Y./*.** Argument
161e0 20 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c   pExpr is an (?,
161f0 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65   ?...) IN(...) e
16200 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20  xpression. This 
16210 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
16220 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
16230 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  ns a nul-termina
16240 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
16250 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66  ining .** the af
16260 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75  finities to be u
16270 73 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  sed for each col
16280 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  umn of the compa
16290 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  rison..**.** It 
162a0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
162b0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
162c0 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ler to ensure th
162d0 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  at the returned.
162e0 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76 65  ** string is eve
162f0 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
16300 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
16310 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  e()..*/.static c
16320 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e  har *exprINAffin
16330 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
16340 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
16350 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d  .  Expr *pLeft =
16360 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
16370 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
16380 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
16390 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65  e(pLeft);.  Sele
163a0 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70  ct *pSelect = (p
163b0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
163c0 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45  _xIsSelect) ? pE
163d0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a  xpr->x.pSelect :
163e0 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74   0;.  char *zRet
163f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ;..  assert( pEx
16400 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
16410 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65  .  zRet = sqlite
16420 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61  3DbMallocRaw(pPa
16430 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29  rse->db, nVal+1)
16440 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a  ;.  if( zRet ){.
16450 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
16460 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20  or(i=0; i<nVal; 
16470 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
16480 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65   *pA = sqlite3Ve
16490 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
164a0 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  (pLeft, i);.    
164b0 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74    char a = sqlit
164c0 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
164d0 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  A);.      if( pS
164e0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
164f0 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74   zRet[i] = sqlit
16500 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
16510 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  y(pSelect->pELis
16520 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61  t->a[i].pExpr, a
16530 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16540 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
16550 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
16560 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c   }.    zRet[nVal
16570 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
16580 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
16590 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
165a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
165b0 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  ERY./*.** Load t
165c0 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
165d0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
165e0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rst argument wit
165f0 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d  h an error .** m
16600 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f  essage of the fo
16610 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62  rm:.**.**   "sub
16620 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
16630 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65  N columns - expe
16640 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f  cted M".*/   .vo
16650 69 64 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c  id sqlite3Subsel
16660 65 63 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a  ectError(Parse *
16670 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74  pParse, int nAct
16680 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74  ual, int nExpect
16690 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
166a0 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c  *zFmt = "sub-sel
166b0 65 63 74 20 72 65 74 75 72 6e 73 20 25 64 20 63  ect returns %d c
166c0 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
166d0 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33  d %d";.  sqlite3
166e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
166f0 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20   zFmt, nActual, 
16700 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64  nExpect);.}.#end
16710 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73  if../*.** Expres
16720 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20  sion pExpr is a 
16730 76 65 63 74 6f 72 20 74 68 61 74 20 68 61 73 20  vector that has 
16740 62 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20 63  been used in a c
16750 6f 6e 74 65 78 74 20 77 68 65 72 65 0a 2a 2a 20  ontext where.** 
16760 69 74 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  it is not permit
16770 74 65 64 2e 20 49 66 20 70 45 78 70 72 20 69 73  ted. If pExpr is
16780 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 76 65   a sub-select ve
16790 63 74 6f 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ctor, this routi
167a0 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65  ne .** loads the
167b0 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 77 69   Parse object wi
167c0 74 68 20 61 20 6d 65 73 73 61 67 65 20 6f 66 20  th a message of 
167d0 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
167e0 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65    "sub-select re
167f0 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20  turns N columns 
16800 2d 20 65 78 70 65 63 74 65 64 20 31 22 0a 2a 2a  - expected 1".**
16810 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 74 20 69 73  .** Or, if it is
16820 20 61 20 72 65 67 75 6c 61 72 20 73 63 61 6c 61   a regular scala
16830 72 20 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20  r vector:.**.** 
16840 20 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73    "row value mis
16850 75 73 65 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64  used".*/   .void
16860 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72   sqlite3VectorEr
16870 72 6f 72 4d 73 67 28 50 61 72 73 65 20 2a 70 50  rorMsg(Parse *pP
16880 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
16890 72 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r){.#ifndef SQLI
168a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
168b0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
168c0 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
168d0 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
168e0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
168f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78  pParse, pExpr->x
16900 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
16910 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 7d  ->nExpr, 1);.  }
16920 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
16930 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16940 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
16950 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
16960 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
16970 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
16980 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
16990 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
169a0 69 6c 6c 20 63 6f 6e 73 74 72 75 63 74 20 61 6e  ill construct an
169b0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
169c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20   containing all 
169d0 74 65 72 6d 73 0a 2a 2a 20 69 6e 20 74 68 65 20  terms.** in the 
169e0 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
169f0 72 61 74 6f 72 2e 20 20 54 68 65 20 49 4e 20 6f  rator.  The IN o
16a00 70 65 72 61 74 6f 72 20 63 61 6e 20 62 65 20 69  perator can be i
16a10 6e 20 65 69 74 68 65 72 20 6f 66 20 74 77 6f 0a  n either of two.
16a20 2a 2a 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20  ** forms:.**.** 
16a30 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31      x IN (4,5,11
16a40 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  )              -
16a50 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
16a60 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74  th list on right
16a70 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20  -hand side.**   
16a80 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61    x IN (SELECT a
16a90 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20   FROM b)     -- 
16aa0 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
16ab0 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
16ac0 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65   right.**.** The
16ad0 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
16ae0 20 69 73 20 74 68 65 20 49 4e 20 6f 70 65 72 61   is the IN opera
16af0 74 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72  tor.  The cursor
16b00 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a   number for the.
16b10 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20 65  ** constructed e
16b20 70 68 65 72 6d 65 72 61 6c 20 74 61 62 6c 65 20  phermeral table 
16b30 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68  is returned.  Th
16b40 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
16b50 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 74 61   ephemeral.** ta
16b60 62 6c 65 20 69 73 20 63 6f 6d 70 75 74 65 64 2c  ble is computed,
16b70 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
16b80 65 72 20 69 73 20 61 6c 73 6f 20 73 74 6f 72 65  er is also store
16b90 64 20 69 6e 20 70 45 78 70 72 2d 3e 69 54 61 62  d in pExpr->iTab
16ba0 6c 65 2c 0a 2a 2a 20 68 6f 77 65 76 65 72 20 74  le,.** however t
16bb0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
16bc0 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20   returned might 
16bd0 6e 6f 74 20 62 65 20 74 68 65 20 73 61 6d 65 2c  not be the same,
16be0 20 61 73 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20   as it might.** 
16bf0 68 61 76 65 20 62 65 65 6e 20 64 75 70 6c 69 63  have been duplic
16c00 61 74 65 64 20 75 73 69 6e 67 20 4f 50 5f 4f 70  ated using OP_Op
16c10 65 6e 44 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  enDup..**.** If 
16c20 74 68 65 20 4c 48 53 20 65 78 70 72 65 73 73 69  the LHS expressi
16c30 6f 6e 20 28 22 78 22 20 69 6e 20 74 68 65 20 65  on ("x" in the e
16c40 78 61 6d 70 6c 65 73 29 20 69 73 20 61 20 63 6f  xamples) is a co
16c50 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 0a 2a  lumn value, or.*
16c60 2a 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  * the SELECT sta
16c70 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
16c80 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
16c90 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
16ca0 20 6f 66 20 74 68 61 74 0a 2a 2a 20 63 6f 6c 75   of that.** colu
16cb0 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
16cc0 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
16cd0 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
16ce0 61 6e 64 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43  and the.** SELEC
16cf0 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
16d00 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
16d10 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
16d20 79 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 66 20  y is used.** if 
16d30 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
16d40 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
16d50 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
16d60 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 27 78 27  f neither.** 'x'
16d70 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e   nor the SELECT.
16d80 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
16d90 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
16da0 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a  umeric affinity.
16db0 2a 2a 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76  ** is used..*/.v
16dc0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 52  oid sqlite3CodeR
16dd0 68 73 4f 66 49 4e 28 0a 20 20 50 61 72 73 65 20  hsOfIN(.  Parse 
16de0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16df0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
16e00 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
16e10 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
16e20 20 20 2f 2a 20 54 68 65 20 49 4e 20 6f 70 65 72    /* The IN oper
16e30 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ator */.  int iT
16e40 61 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ab              
16e50 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 63 75    /* Use this cu
16e60 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  rsor number */.)
16e70 7b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65  {.  int addrOnce
16e80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16e90 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
16ea0 65 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75  e OP_Once instru
16eb0 63 74 69 6f 6e 20 61 74 20 74 6f 70 20 2a 2f 0a  ction at top */.
16ec0 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ee0 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
16ef0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
16f00 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  truction */.  Ex
16f10 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
16f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
16f30 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
16f40 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 4b 65 79  perator */.  Key
16f50 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
16f60 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20   0;      /* Key 
16f70 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
16f80 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20   int nVal;      
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16fa0 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70  Size of vector p
16fb0 4c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  Left */.  Vdbe *
16fc0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
16fd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
16fe0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
16ff0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
17000 6f 6e 20 2a 2f 0a 0a 20 20 76 20 3d 20 70 50 61  on */..  v = pPa
17010 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
17020 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20  sert( v!=0 );.. 
17030 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69   /* The evaluati
17040 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 6d 75 73  on of the IN mus
17050 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76  t be repeated ev
17060 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a  ery time it.  **
17070 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
17080 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
17090 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
170a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
170b0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
170c0 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
170d0 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
170e0 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
170f0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
17100 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
17110 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
17120 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
17130 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
17140 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
17150 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
17160 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
17170 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
17180 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 20  compute the RHS 
17190 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 61  just once.  ** a
171a0 6e 64 20 72 65 75 73 65 20 69 74 20 6d 61 6e 79  nd reuse it many
171b0 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 69   names..  */.  i
171c0 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
171d0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
171e0 72 53 65 6c 65 63 74 29 20 26 26 20 70 50 61 72  rSelect) && pPar
171f0 73 65 2d 3e 69 53 65 6c 66 54 61 62 3d 3d 30 20  se->iSelfTab==0 
17200 29 7b 0a 20 20 20 20 2f 2a 20 52 65 75 73 65 20  ){.    /* Reuse 
17210 6f 66 20 74 68 65 20 52 48 53 20 69 73 20 61 6c  of the RHS is al
17220 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 2f 2a 20  lowed */.    /* 
17230 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
17240 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
17250 20 63 6f 64 65 64 2c 20 62 75 74 20 74 68 65 20   coded, but the 
17260 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20  previous code.  
17270 20 20 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 68    ** might not h
17280 61 76 65 20 62 65 65 6e 20 69 6e 76 6f 6b 65 64  ave been invoked
17290 20 79 65 74 2c 20 73 6f 20 69 6e 76 6f 6b 65 20   yet, so invoke 
172a0 69 74 20 6e 6f 77 20 61 73 20 61 20 73 75 62 72  it now as a subr
172b0 6f 75 74 69 6e 65 2e 20 0a 20 20 20 20 2a 2f 0a  outine. .    */.
172c0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
172d0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
172e0 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20 20 20  P_Subrtn) ){.   
172f0 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
17300 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
17310 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
17320 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17330 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
17340 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
17350 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
17360 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51          ExplainQ
17370 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
17380 2c 20 30 2c 20 22 52 45 55 53 45 20 4c 49 53 54  , 0, "REUSE LIST
17390 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20   SUBQUERY %d",. 
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
173b0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73  pr->x.pSelect->s
173c0 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 7d 0a  elId));.      }.
173d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
173e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
173f0 73 75 62 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75  sub, pExpr->y.su
17400 62 2e 72 65 67 52 65 74 75 72 6e 2c 0a 20 20 20  b.regReturn,.   
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17420 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75       pExpr->y.su
17430 62 2e 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  b.iAddr);.      
17440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17450 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
17460 20 69 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 54   iTab, pExpr->iT
17470 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  able);.      sql
17480 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
17490 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20  (v, addrOnce);. 
174a0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
174b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e   }..    /* Begin
174c0 20 63 6f 64 69 6e 67 20 74 68 65 20 73 75 62 72   coding the subr
174d0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78  outine */.    Ex
174e0 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
174f0 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b  xpr, EP_Subrtn);
17500 0a 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75  .    pExpr->y.su
17510 62 2e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  b.regReturn = ++
17520 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
17530 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69    pExpr->y.sub.i
17540 41 64 64 72 20 3d 0a 20 20 20 20 20 20 73 71 6c  Addr =.      sql
17550 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17560 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
17570 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65   pExpr->y.sub.re
17580 67 52 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20  gReturn) + 1;.  
17590 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
175a0 2c 20 22 72 65 74 75 72 6e 20 61 64 64 72 65 73  , "return addres
175b0 73 22 29 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f  s"));..    addrO
175c0 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nce = sqlite3Vdb
175d0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
175e0 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
175f0 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(v);.  }..  /* 
17600 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
17610 74 68 69 73 20 69 73 20 61 20 76 65 63 74 6f 72  this is a vector
17620 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
17630 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
17640 3e 70 4c 65 66 74 3b 0a 20 20 6e 56 61 6c 20 3d  >pLeft;.  nVal =
17650 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
17660 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 0a  orSize(pLeft);..
17670 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
17680 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
17690 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e  le that will con
176a0 74 61 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  tain the content
176b0 20 6f 66 0a 20 20 2a 2a 20 52 48 53 20 6f 66 20   of.  ** RHS of 
176c0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  the IN operator.
176d0 0a 20 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e 69  .  */.  pExpr->i
176e0 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
176f0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
17700 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
17710 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45  penEphemeral, pE
17720 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 56 61  xpr->iTable, nVa
17730 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l);.#ifdef SQLIT
17740 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
17750 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 69 66 28 20  _COMMENTS.  if( 
17760 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
17770 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
17780 65 63 74 29 20 29 7b 0a 20 20 20 20 56 64 62 65  ect) ){.    Vdbe
17790 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 52 65 73  Comment((v, "Res
177a0 75 6c 74 20 6f 66 20 53 45 4c 45 43 54 20 25 75  ult of SELECT %u
177b0 22 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  ", pExpr->x.pSel
177c0 65 63 74 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20  ect->selId));.  
177d0 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 43  }else{.    VdbeC
177e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 52 48 53 20  omment((v, "RHS 
177f0 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 22 29  of IN operator")
17800 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
17810 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
17820 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
17830 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c  Parse->db, nVal,
17840 20 31 29 3b 0a 0a 20 20 69 66 28 20 45 78 70 72   1);..  if( Expr
17850 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
17860 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
17870 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
17880 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  1:     expr IN (
17890 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20  SELECT ...).    
178a0 2a 2a 0a 20 20 20 20 2a 2a 20 47 65 6e 65 72 61  **.    ** Genera
178b0 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
178c0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
178d0 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
178e0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
178f0 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
17900 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
17910 61 62 6f 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  above..    */.  
17920 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
17930 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  t = pExpr->x.pSe
17940 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 4c 69  lect;.    ExprLi
17950 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65  st *pEList = pSe
17960 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20  lect->pEList;.. 
17970 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
17980 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
17990 22 25 73 4c 49 53 54 20 53 55 42 51 55 45 52 59  "%sLIST SUBQUERY
179a0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 61 64   %d",.        ad
179b0 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45  drOnce?"":"CORRE
179c0 4c 41 54 45 44 20 22 2c 20 70 53 65 6c 65 63 74  LATED ", pSelect
179d0 2d 3e 73 65 6c 49 64 0a 20 20 20 20 29 29 3b 0a  ->selId.    ));.
179e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48      /* If the LH
179f0 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68 65  S and RHS of the
17a00 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f 20   IN operator do 
17a10 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74 0a  not match, that.
17a20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c      ** error wil
17a30 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61 75 67  l have been caug
17a40 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77  ht long before w
17a50 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
17a60 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 41  nt. */.    if( A
17a70 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45  LWAYS(pEList->nE
17a80 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20  xpr==nVal) ){.  
17a90 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
17aa0 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  est;.      int i
17ab0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
17ac0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
17ad0 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 54  est, SRT_Set, iT
17ae0 61 62 29 3b 0a 20 20 20 20 20 20 64 65 73 74 2e  ab);.      dest.
17af0 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70 72 49  zAffSdst = exprI
17b00 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  NAffinity(pParse
17b10 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
17b20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
17b30 3d 20 30 3b 0a 20 20 20 20 20 20 74 65 73 74 63  = 0;.      testc
17b40 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65  ase( pSelect->se
17b50 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
17b60 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
17b70 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f  stcase( pKeyInfo
17b80 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64  ==0 ); /* Caused
17b90 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74   by OOM in sqlit
17ba0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29  e3KeyInfoAlloc()
17bb0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
17bc0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
17bd0 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
17be0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  st) ){.        s
17bf0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
17c00 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
17c10 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
17c20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
17c30 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
17c40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
17c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
17c60 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
17c70 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66  se->db, dest.zAf
17c80 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 61 73  fSdst);.      as
17c90 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d  sert( pKeyInfo!=
17ca0 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c  0 ); /* OOM will
17cb0 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74 65   cause exit afte
17cc0 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  r sqlite3Select(
17cd0 29 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  ) */.      asser
17ce0 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
17cf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
17d00 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
17d10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
17d20 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
17d30 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
17d40 6f 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  o) );.      for(
17d50 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  i=0; i<nVal; i++
17d60 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
17d70 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  *p = sqlite3Vect
17d80 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
17d90 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
17da0 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
17db0 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[i] = sqlite3Bi
17dc0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
17dd0 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq(.            
17de0 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
17df0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20  t->a[i].pExpr.  
17e00 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
17e10 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
17e20 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
17e30 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a  >x.pList!=0) ){.
17e40 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
17e50 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
17e60 6c 69 73 74 29 0a 20 20 20 20 2a 2a 0a 20 20 20  list).    **.   
17e70 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   ** For each exp
17e80 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
17e90 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
17ea0 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
17eb0 61 6e 64 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  and.    ** store
17ec0 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
17ed0 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
17ee0 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
17ef0 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
17f00 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
17f10 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
17f20 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
17f30 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
17f40 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 20 63 6f 6c  not.    ** a col
17f50 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
17f60 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a   affinity..    *
17f70 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66 69 6e  /.    char affin
17f80 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ity;            
17f90 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  /* Affinity of t
17fa0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
17fb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   */.    int i;. 
17fc0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
17fd0 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
17fe0 69 73 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ist;.    struct 
17ff0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
18000 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 31  Item;.    int r1
18010 2c 20 72 32 3b 0a 20 20 20 20 61 66 66 69 6e 69  , r2;.    affini
18020 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
18030 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
18040 0a 20 20 20 20 69 66 28 20 61 66 66 69 6e 69 74  .    if( affinit
18050 79 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  y<=SQLITE_AFF_NO
18060 4e 45 20 29 7b 0a 20 20 20 20 20 20 61 66 66 69  NE ){.      affi
18070 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
18080 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20  F_BLOB;.    }.  
18090 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
180a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
180b0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
180c0 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
180d0 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 70 4b 65  fo) );.      pKe
180e0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20  yInfo->aColl[0] 
180f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
18100 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
18110 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
18120 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  }..    /* Loop t
18130 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
18140 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
18150 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 72 31 20  ist>. */.    r1 
18160 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
18170 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
18180 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
18190 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
181a0 0a 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74  .    for(i=pList
181b0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
181c0 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
181d0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
181e0 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
181f0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20  Item->pExpr;..  
18200 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78      /* If the ex
18210 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
18220 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65  constant then we
18230 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20   will need to.  
18240 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
18250 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73  he test that was
18260 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65   generated above
18270 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
18280 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
18290 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65  ode only execute
182a0 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65  s once.  Because
182b0 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74   for a non-const
182c0 61 6e 74 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  ant.      ** exp
182d0 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
182e0 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
182f0 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
18300 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
18310 20 61 64 64 72 4f 6e 63 65 20 26 26 20 21 73 71   addrOnce && !sq
18320 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
18330 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
18340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18350 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
18360 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20  ddrOnce);.      
18370 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65    ExprClearPrope
18380 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75  rty(pExpr, EP_Su
18390 62 72 74 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  brtn);.        a
183a0 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20  ddrOnce = 0;.   
183b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
183c0 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
183d0 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
183e0 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
183f0 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
18400 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
18410 65 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72  e(pParse, pE2, r
18420 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
18430 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18440 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 31  P_MakeRecord, r1
18450 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
18460 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ty, 1);.      sq
18470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
18480 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
18490 72 74 2c 20 69 54 61 62 2c 20 72 32 2c 20 72 31  rt, iTab, r2, r1
184a0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
184b0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
184c0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
184d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
184e0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
184f0 72 73 65 2c 20 72 32 29 3b 0a 20 20 7d 0a 20 20  rse, r2);.  }.  
18500 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
18510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18520 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
18530 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66   (void *)pKeyInf
18540 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
18550 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72 4f 6e    }.  if( addrOn
18560 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ce ){.    sqlite
18570 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
18580 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
18590 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65  /* Subroutine re
185a0 74 75 72 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  turn */.    sqli
185b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
185c0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 45 78 70   OP_Return, pExp
185d0 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75  r->y.sub.regRetu
185e0 72 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rn);.    sqlite3
185f0 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
18600 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64  pExpr->y.sub.iAd
18610 64 72 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  dr-1, sqlite3Vdb
18620 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
18630 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  1);.    sqlite3C
18640 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
18650 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 7d 0a  (pParse);.  }.}.
18660 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
18670 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
18680 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  /../*.** Generat
18690 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
186a0 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
186b0 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
186c0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6f 72  expression.** or
186d0 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
186e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
186f0 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
18700 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
18710 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
18720 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
18730 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
18740 75 62 71 75 65 72 79 0a 2a 2a 0a 2a 2a 20 54 68  ubquery.**.** Th
18750 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
18760 72 20 69 73 20 74 68 65 20 53 45 4c 45 43 54 20  r is the SELECT 
18770 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
18780 6f 72 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  or to be coded..
18790 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
187a0 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
187b0 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 2e  olds the result.
187c0 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f    For a multi-co
187d0 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 0a 2a 2a  lumn SELECT, .**
187e0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
187f0 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69  tored in a conti
18800 67 75 6f 75 73 20 61 72 72 61 79 20 6f 66 20 72  guous array of r
18810 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
18820 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
18830 20 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72   is the register
18840 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   of the left-mos
18850 74 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e  t result column.
18860 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
18870 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
18880 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
18890 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
188a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
188b0 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20  Subselect(Parse 
188c0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
188d0 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 61 64 64  Expr){.  int add
188e0 72 4f 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20  rOnce = 0;      
188f0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18900 6f 66 20 4f 50 5f 4f 6e 63 65 20 61 74 20 74 6f  of OP_Once at to
18910 70 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  p of subroutine 
18920 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
18930 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
18940 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
18950 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
18960 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
18970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18980 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
18990 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
189a0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
189b0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
189c0 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69  * How to deal wi
189d0 74 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  th SELECT result
189e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20   */.  int nReg; 
189f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a00 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74    /* Registers t
18a10 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
18a20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20  Expr *pLimit;   
18a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18a40 65 77 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73  ew limit express
18a50 69 6f 6e 20 2a 2f 0a 0a 20 20 56 64 62 65 20 2a  ion */..  Vdbe *
18a60 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
18a70 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
18a80 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
18a90 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
18aa0 58 49 53 54 53 20 29 3b 0a 20 20 74 65 73 74 63  XISTS );.  testc
18ab0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
18ac0 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 61  TK_SELECT );.  a
18ad0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
18ae0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70  ==TK_EXISTS || p
18af0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
18b00 45 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ECT );.  assert(
18b10 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
18b20 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
18b30 6c 65 63 74 29 20 29 3b 0a 20 20 70 53 65 6c 20  lect) );.  pSel 
18b40 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
18b50 63 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76  ct;..  /* The ev
18b60 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  aluation of the 
18b70 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75  EXISTS/SELECT mu
18b80 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65  st be repeated e
18b90 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a  very time it.  *
18ba0 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
18bb0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
18bc0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
18bd0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
18be0 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
18bf0 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
18c00 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
18c10 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
18c20 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
18c30 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
18c40 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
18c50 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
18c60 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
18c70 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
18c80 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
18c90 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
18ca0 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
18cb0 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
18cc0 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
18cd0 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
18ce0 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
18cf0 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
18d00 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
18d10 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
18d20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
18d30 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
18d40 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  lect) ){.    /* 
18d50 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
18d60 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
18d70 20 63 6f 64 65 64 2c 20 74 68 65 6e 20 69 6e 76   coded, then inv
18d80 6f 6b 65 20 69 74 20 61 73 20 61 0a 20 20 20 20  oke it as a.    
18d90 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 2a  ** subroutine. *
18da0 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  /.    if( ExprHa
18db0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
18dc0 20 45 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20   EP_Subrtn) ){. 
18dd0 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
18de0 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
18df0 2c 20 22 52 45 55 53 45 20 53 55 42 51 55 45 52  , "REUSE SUBQUER
18e00 59 20 25 64 22 2c 20 70 53 65 6c 2d 3e 73 65 6c  Y %d", pSel->sel
18e10 49 64 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Id));.      sqli
18e20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18e30 20 4f 50 5f 47 6f 73 75 62 2c 20 70 45 78 70 72   OP_Gosub, pExpr
18e40 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72  ->y.sub.regRetur
18e50 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
18e60 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
18e70 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 29 3b 0a  ->y.sub.iAddr);.
18e80 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
18e90 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
18ea0 7d 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  }..    /* Begin 
18eb0 63 6f 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  coding the subro
18ec0 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70  utine */.    Exp
18ed0 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
18ee0 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a  pr, EP_Subrtn);.
18ef0 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62      pExpr->y.sub
18f00 2e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  .regReturn = ++p
18f10 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
18f20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41   pExpr->y.sub.iA
18f30 64 64 72 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  ddr =.      sqli
18f40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18f50 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
18f60 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67  pExpr->y.sub.reg
18f70 52 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20  Return) + 1;.   
18f80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18f90 20 22 72 65 74 75 72 6e 20 61 64 64 72 65 73 73   "return address
18fa0 22 29 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e  "));..    addrOn
18fb0 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
18fc0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
18fd0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
18fe0 28 76 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  (v);.  }.  .  /*
18ff0 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67   For a SELECT, g
19000 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
19010 70 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66  put the values f
19020 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  or all columns o
19030 66 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  f.  ** the first
19040 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72   row into an arr
19050 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
19060 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 69  and return the i
19070 6e 64 65 78 20 6f 66 0a 20 20 2a 2a 20 74 68 65  ndex of.  ** the
19080 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 2e   first register.
19090 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
190a0 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c  is is an EXISTS,
190b0 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65   write an intege
190c0 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29  r 0 (not exists)
190d0 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a 20   or 1 (exists). 
190e0 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73   ** into a regis
190f0 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ter and return t
19100 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d  hat register num
19110 62 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ber..  **.  ** I
19120 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68  n both cases, th
19130 65 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65  e query is augme
19140 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54  nted with "LIMIT
19150 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 2a 2a 20   1".  Any .  ** 
19160 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69  preexisting limi
19170 74 20 69 73 20 64 69 73 63 61 72 64 65 64 20 69  t is discarded i
19180 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e  n place of the n
19190 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 2a 2f  ew LIMIT 1..  */
191a0 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
191b0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
191c0 22 25 73 53 43 41 4c 41 52 20 53 55 42 51 55 45  "%sSCALAR SUBQUE
191d0 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  RY %d",.        
191e0 61 64 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52  addrOnce?"":"COR
191f0 52 45 4c 41 54 45 44 20 22 2c 20 70 53 65 6c 2d  RELATED ", pSel-
19200 3e 73 65 6c 49 64 29 29 3b 0a 20 20 6e 52 65 67  >selId));.  nReg
19210 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
19220 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e  _SELECT ? pSel->
19230 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  pEList->nExpr : 
19240 31 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  1;.  sqlite3Sele
19250 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
19260 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 0, pParse->nMe
19270 6d 2b 31 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  m+1);.  pParse->
19280 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
19290 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
192a0 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
192b0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
192c0 5f 4d 65 6d 3b 0a 20 20 20 20 64 65 73 74 2e 69  _Mem;.    dest.i
192d0 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50  Sdst = dest.iSDP
192e0 61 72 6d 3b 0a 20 20 20 20 64 65 73 74 2e 6e 53  arm;.    dest.nS
192f0 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  dst = nReg;.    
19300 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19310 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
19320 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64   dest.iSDParm, d
19330 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67  est.iSDParm+nReg
19340 2d 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  -1);.    VdbeCom
19350 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
19360 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
19370 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19380 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
19390 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 73 71 6c  _Exists;.    sql
193a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
193b0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
193c0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
193d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
193e0 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
193f0 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 7d 0a   result"));.  }.
19400 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 4c 69 6d    if( pSel->pLim
19410 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  it ){.    /* The
19420 20 73 75 62 71 75 65 72 79 20 61 6c 72 65 61 64   subquery alread
19430 79 20 68 61 73 20 61 20 6c 69 6d 69 74 2e 20 20  y has a limit.  
19440 49 66 20 74 68 65 20 70 72 65 2d 65 78 69 73 74  If the pre-exist
19450 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 58 0a 20  ing limit is X. 
19460 20 20 20 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20     ** then make 
19470 74 68 65 20 6e 65 77 20 6c 69 6d 69 74 20 58 3c  the new limit X<
19480 3e 30 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  >0 so that the n
19490 65 77 20 6c 69 6d 69 74 20 69 73 20 65 69 74 68  ew limit is eith
194a0 65 72 20 31 20 6f 72 20 30 20 2a 2f 0a 20 20 20  er 1 or 0 */.   
194b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
194c0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70  Parse->db;.    p
194d0 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
194e0 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
194f0 45 52 2c 20 22 30 22 29 3b 0a 20 20 20 20 69 66  ER, "0");.    if
19500 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ( pLimit ){.    
19510 20 20 70 4c 69 6d 69 74 2d 3e 61 66 66 45 78 70    pLimit->affExp
19520 72 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  r = SQLITE_AFF_N
19530 55 4d 45 52 49 43 3b 0a 20 20 20 20 20 20 70 4c  UMERIC;.      pL
19540 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45  imit = sqlite3PE
19550 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e  xpr(pParse, TK_N
19560 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
19580 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
19590 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e  , pSel->pLimit->
195a0 70 4c 65 66 74 2c 20 30 29 2c 20 70 4c 69 6d 69  pLeft, 0), pLimi
195b0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
195c0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
195d0 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
195e0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 53  ->pLeft);.    pS
195f0 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  el->pLimit->pLef
19600 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 7d 65  t = pLimit;.  }e
19610 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
19620 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65 2d 65  here is no pre-e
19630 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 61 64  xisting limit ad
19640 64 20 61 20 6c 69 6d 69 74 20 6f 66 20 31 20 2a  d a limit of 1 *
19650 2f 0a 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 73  /.    pLimit = s
19660 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
19670 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  e->db, TK_INTEGE
19680 52 2c 20 22 31 22 29 3b 0a 20 20 20 20 70 53 65  R, "1");.    pSe
19690 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
196a0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
196b0 20 54 4b 5f 4c 49 4d 49 54 2c 20 70 4c 69 6d 69   TK_LIMIT, pLimi
196c0 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 53 65  t, 0);.  }.  pSe
196d0 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  l->iLimit = 0;. 
196e0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
196f0 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
19700 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 72   &dest) ){.    r
19710 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
19720 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72  Expr->iTable = r
19730 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Reg = dest.iSDPa
19740 72 6d 3b 0a 20 20 45 78 70 72 53 65 74 56 56 41  rm;.  ExprSetVVA
19750 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
19760 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
19770 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 7b 0a  if( addrOnce ){.
19780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
19790 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f  umpHere(v, addrO
197a0 6e 63 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75  nce);..    /* Su
197b0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
197c0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
197d0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
197e0 65 74 75 72 6e 2c 20 70 45 78 70 72 2d 3e 79 2e  eturn, pExpr->y.
197f0 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 3b 0a  sub.regReturn);.
19800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19810 68 61 6e 67 65 50 31 28 76 2c 20 70 45 78 70 72  hangeP1(v, pExpr
19820 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 2d 31 2c  ->y.sub.iAddr-1,
19830 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19840 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20  entAddr(v)-1);. 
19850 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
19860 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
19870 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  se);.  }..  retu
19880 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69  rn rReg;.}.#endi
19890 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
198a0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
198b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
198c0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
198d0 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20   Expr pIn is an 
198e0 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  IN(...) expressi
198f0 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
19900 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  n checks that th
19910 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
19920 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
19930 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72  he IN() operator
19940 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75   has the same nu
19950 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75  mber of .** colu
19960 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f  mns as the vecto
19970 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72  r on the LHS. Or
19980 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  , if the RHS of 
19990 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20  the IN() is not 
199a0 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c  .** a sub-query,
199b0 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73   that the LHS is
199c0 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a   a vector of siz
199d0 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 1..*/.int sqli
199e0 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50  te3ExprCheckIN(P
199f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
19a00 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20  pr *pIn){.  int 
19a10 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
19a20 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
19a30 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  pIn->pLeft);.  i
19a40 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26  f( (pIn->flags &
19a50 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
19a60 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f  {.    if( nVecto
19a70 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63  r!=pIn->x.pSelec
19a80 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
19a90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19aa0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
19ab0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70  pParse, pIn->x.p
19ac0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
19ad0 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b  nExpr, nVector);
19ae0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
19af0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
19b00 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b  f( nVector!=1 ){
19b10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74  .    sqlite3Vect
19b20 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  orErrorMsg(pPars
19b30 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a  e, pIn->pLeft);.
19b40 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
19b50 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
19b60 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
19b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19b80 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
19b90 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
19ba0 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
19bb0 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
19bc0 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
19bd0 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
19be0 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
19bf0 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
19c00 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
19c10 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f   scalar or vecto
19c20 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  r expression.  T
19c30 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e  he .** right-han
19c40 64 20 73 69 64 65 20 28 52 48 53 29 20 69 73 20  d side (RHS) is 
19c50 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
19c60 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20   or more scalar 
19c70 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20  values, or a.** 
19c80 73 75 62 71 75 65 72 79 2e 20 20 49 66 20 74 68  subquery.  If th
19c90 65 20 52 48 53 20 69 73 20 61 20 73 75 62 71 75  e RHS is a subqu
19ca0 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  ery, the number 
19cb0 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
19cc0 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20  s must.** match 
19cd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
19ce0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63  lumns in the vec
19cf0 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
19d00 20 49 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a   If the RHS is.*
19d10 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  * a list of valu
19d20 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74  es, the LHS must
19d30 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a   be a scalar. .*
19d40 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72  *.** The IN oper
19d50 61 74 6f 72 20 69 73 20 74 72 75 65 20 69 66 20  ator is true if 
19d60 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73  the LHS value is
19d70 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
19d80 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68  n the RHS..** Th
19d90 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73  e result is fals
19da0 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
19db0 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69  definitely not i
19dc0 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
19dd0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55  .** result is NU
19de0 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73 65 6e  LL if the presen
19df0 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ce of the LHS in
19e00 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20   the RHS cannot 
19e10 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  be .** determine
19e20 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a  d due to NULLs..
19e30 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
19e40 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
19e50 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  e that jumps to 
19e60 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
19e70 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
19e80 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
19e90 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
19ea0 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
19eb0 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
19ec0 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
19ed0 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
19ee0 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
19ef0 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
19f00 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
19f10 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
19f20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
19f30 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a  fall through..**
19f40 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70 61  .** See the sepa
19f50 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72  rate in-operator
19f60 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .md documentatio
19f70 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61  n file in the ca
19f80 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74  nonical.** SQLit
19f90 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f  e source tree fo
19fa0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
19fb0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
19fc0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
19fd0 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61  ExprCodeIN(.  Pa
19fe0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
19ff0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
1a000 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1a010 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1a020 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1a030 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
1a040 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1a050 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c  int destIfFalse,
1a060 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
1a070 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74  re if LHS is not
1a080 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
1a090 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64  e RHS */.  int d
1a0a0 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20  estIfNull       
1a0b0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1a0c0 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
1a0d0 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20   unknown due to 
1a0e0 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULLs */.){.  in
1a0f0 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  t rRhsHasNull = 
1a100 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  0;  /* Register 
1a110 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20  that is true if 
1a120 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
1a130 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  L values */.  in
1a140 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
1a150 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
1a160 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
1a170 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  rLhs;           
1a180 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29    /* Register(s)
1a190 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53   holding the LHS
1a1a0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
1a1b0 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20   rLhsOrig;      
1a1c0 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73     /* LHS values
1a1d0 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65   prior to reorde
1a1e0 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20  ring by aiMap[] 
1a1f0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
1a200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
1a210 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
1a220 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1a230 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20  int *aiMap = 0; 
1a240 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f        /* Map fro
1a250 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74  m vector field t
1a260 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a  o index column *
1a270 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d  /.  char *zAff =
1a280 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66   0;       /* Aff
1a290 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72  inity string for
1a2a0 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a   comparisons */.
1a2b0 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20    int nVector;  
1a2c0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1a2d0 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74  of vectors for t
1a2e0 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  his IN operator 
1a2f0 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b  */.  int iDummy;
1a300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75             /* Du
1a310 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f  mmy parameter to
1a320 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
1a330 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  ) */.  Expr *pLe
1a340 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ft;          /* 
1a350 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
1a360 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
1a370 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1a380 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f        /* loop co
1a390 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64  unter */.  int d
1a3a0 65 73 74 53 74 65 70 32 3b 20 20 20 20 20 20 20  estStep2;       
1a3b0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
1a3c0 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65  p when NULLs see
1a3d0 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20  n in step 2 */. 
1a3e0 20 69 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d   int destStep6 =
1a3f0 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20   0;    /* Start 
1a400 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70  of code for Step
1a410 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
1a420 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a  TruthOp;      /*
1a430 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f   Address of opco
1a440 64 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  de that determin
1a450 65 73 20 74 68 65 20 49 4e 20 69 73 20 74 72 75  es the IN is tru
1a460 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e  e */.  int destN
1a470 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20  otNull;      /* 
1a480 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 20 63  Jump here if a c
1a490 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
1a4a0 20 74 72 75 65 20 69 6e 20 73 74 65 70 20 36 20   true in step 6 
1a4b0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
1a4c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
1a4d0 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20  p of the step-6 
1a4e0 6c 6f 6f 70 20 2a 2f 20 0a 20 20 69 6e 74 20 69  loop */ .  int i
1a4f0 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
1a500 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 75 73 65   /* Index to use
1a510 20 2a 2f 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70   */..  pLeft = p
1a520 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
1a530 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
1a540 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45  eckIN(pParse, pE
1a550 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  xpr) ) return;. 
1a560 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66   zAff = exprINAf
1a570 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
1a580 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72  Expr);.  nVector
1a590 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
1a5a0 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
1a5b0 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20  pLeft);.  aiMap 
1a5c0 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44  = (int*)sqlite3D
1a5d0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  bMallocZero(.   
1a5e0 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e     pParse->db, n
1a5f0 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69  Vector*(sizeof(i
1a600 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  nt) + sizeof(cha
1a610 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69  r)) + 1.  );.  i
1a620 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
1a630 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
1a640 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  to sqlite3ExprCo
1a650 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a  deIN_oom_error;.
1a660 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
1a670 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   compute the RHS
1a680 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65  . After this ste
1a690 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f  p, if anything o
1a6a0 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49  ther than.  ** I
1a6b0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
1a6c0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61  returned, the ta
1a6d0 62 6c 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ble opened with 
1a6e0 63 75 72 73 6f 72 20 69 54 61 62 0a 20 20 2a 2a  cursor iTab.  **
1a6f0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
1a700 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
1a710 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e  p the RHS. If IN
1a720 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
1a730 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68  eturned,.  ** th
1a740 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65  e RHS has not ye
1a750 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a  t been coded.  *
1a760 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
1a770 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
1a780 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
1a790 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
1a7a0 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
1a7b0 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
1a7c0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
1a7d0 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
1a7e0 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
1a7f0 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
1a800 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20  arse, pExpr,.   
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44            IN_IND
1a830 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20  EX_MEMBERSHIP | 
1a840 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
1a850 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1a870 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1a880 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52  IfNull ? 0 : &rR
1a890 68 73 48 61 73 4e 75 6c 6c 2c 0a 20 20 20 20 20  hsHasNull,.     
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8b0 20 20 20 20 20 20 20 20 61 69 4d 61 70 2c 20 26          aiMap, &
1a8c0 69 54 61 62 29 3b 0a 0a 20 20 61 73 73 65 72 74  iTab);..  assert
1a8d0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1a8e0 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20  | nVector==1 || 
1a8f0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1a900 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  EPH.       || eT
1a910 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
1a920 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65  DEX_ASC || eType
1a930 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
1a940 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64  _DESC .  );.#ifd
1a950 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1a960 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61    /* Confirm tha
1a970 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69  t aiMap[] contai
1a980 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67  ns nVector integ
1a990 65 72 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  er values betwee
1a9a0 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65  n 0 and.  ** nVe
1a9b0 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72  ctor-1. */.  for
1a9c0 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1a9d0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
1a9e0 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63  , cnt;.    for(c
1a9f0 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f  nt=j=0; j<nVecto
1aa00 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61  r; j++) if( aiMa
1aa10 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b  p[j]==i ) cnt++;
1aa20 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6e 74  .    assert( cnt
1aa30 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ==1 );.  }.#endi
1aa40 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  f..  /* Code the
1aa50 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e   LHS, the <expr>
1aa60 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
1aa70 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20   (...)". If the 
1aa80 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76  LHS is a .  ** v
1aa90 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69  ector, then it i
1aaa0 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  s stored in an a
1aab0 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20  rray of nVector 
1aac0 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
1aad0 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a  ng .  ** at r1..
1aae0 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65    **.  ** sqlite
1aaf0 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d  3FindInIndex() m
1ab00 69 67 68 74 20 68 61 76 65 20 72 65 6f 72 64 65  ight have reorde
1ab10 72 65 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f  red the fields o
1ab20 66 20 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72  f the LHS vector
1ab30 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  .  ** so that th
1ab40 65 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20  e fields are in 
1ab50 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61  the same order a
1ab60 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e  s an existing in
1ab70 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20  dex.   The.  ** 
1ab80 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f  aiMap[] array co
1ab90 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67  ntains a mapping
1aba0 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
1abb0 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64  al LHS field ord
1abc0 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66  er to.  ** the f
1abd0 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20  ield order that 
1abe0 6d 61 74 63 68 65 73 20 74 68 65 20 52 48 53 20  matches the RHS 
1abf0 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 72 4c  index..  */.  rL
1ac00 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64  hsOrig = exprCod
1ac10 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  eVector(pParse, 
1ac20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b  pLeft, &iDummy);
1ac30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
1ac40 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69  ector && aiMap[i
1ac50 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20  ]==i; i++){} /* 
1ac60 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72  Are LHS fields r
1ac70 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69  eordered? */.  i
1ac80 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b  f( i==nVector ){
1ac90 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c  .    /* LHS fiel
1aca0 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64  ds are not reord
1acb0 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73  ered */.    rLhs
1acc0 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d   = rLhsOrig;.  }
1acd0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  else{.    /* Nee
1ace0 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65  d to reorder the
1acf0 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f   LHS fields acco
1ad00 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a  rding to aiMap *
1ad10 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c  /.    rLhs = sql
1ad20 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
1ad30 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72  (pParse, nVector
1ad40 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1ad50 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
1ad60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ad70 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1ad80 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c  opy, rLhsOrig+i,
1ad90 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20   rLhs+aiMap[i], 
1ada0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
1adb0 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69   /* If sqlite3Fi
1adc0 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20  ndInIndex() did 
1add0 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61  not find or crea
1ade0 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  te an index that
1adf0 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c   is.  ** suitabl
1ae00 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  e for evaluating
1ae10 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
1ae20 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
1ae30 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71  using a.  ** seq
1ae40 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
1ae50 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  sons..  **.  ** 
1ae60 54 68 69 73 20 69 73 20 73 74 65 70 20 28 31 29  This is step (1)
1ae70 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61   in the in-opera
1ae80 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64  tor.md optimized
1ae90 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f   algorithm..  */
1aea0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e  .  if( eType==IN
1aeb0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20  _INDEX_NOOP ){. 
1aec0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
1aed0 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
1aee0 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  ist;.    CollSeq
1aef0 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
1af00 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1af10 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1af20 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65  t);.    int labe
1af30 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lOk = sqlite3Vdb
1af40 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
1af50 65 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20  e);.    int r2, 
1af60 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69  regToFree;.    i
1af70 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30  nt regCkNull = 0
1af80 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
1af90 20 20 69 6e 74 20 62 4c 68 73 52 65 61 6c 3b 20    int bLhsReal; 
1afa0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1afb0 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 68 61  LHS of the IN ha
1afc0 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 20  s REAL affinity 
1afd0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
1afe0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1aff0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1b000 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
1b010 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
1b020 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
1b030 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c   regCkNull = sql
1b040 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1b050 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1b060 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b070 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c  v, OP_BitAnd, rL
1b080 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e  hs, rLhs, regCkN
1b090 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ull);.    }.    
1b0a0 62 4c 68 73 52 65 61 6c 20 3d 20 73 71 6c 69 74  bLhsReal = sqlit
1b0b0 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1b0c0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3d 3d 53 51  Expr->pLeft)==SQ
1b0d0 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
1b0e0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1b0f0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69  pList->nExpr; ii
1b100 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  ++){.      if( b
1b110 4c 68 73 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  LhsReal ){.     
1b120 20 20 20 72 32 20 3d 20 72 65 67 54 6f 46 72 65     r2 = regToFre
1b130 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
1b140 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1b150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1b160 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1b170 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
1b180 72 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  r, r2);.        
1b190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b1a0 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  4(v, OP_Affinity
1b1b0 2c 20 72 32 2c 20 31 2c 20 30 2c 20 22 45 22 2c  , r2, 1, 0, "E",
1b1c0 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1b1d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b1e0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1b1f0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1b200 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  e, pList->a[ii].
1b210 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65  pExpr, &regToFre
1b220 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1b230 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
1b240 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
1b250 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61  nBeNull(pList->a
1b260 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
1b270 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b280 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
1b290 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c  itAnd, regCkNull
1b2a0 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  , r2, regCkNull)
1b2b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b2c0 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  if( ii<pList->nE
1b2d0 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e  xpr-1 || destIfN
1b2e0 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
1b2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b300 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1b310 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61   OP_Eq, rLhs, la
1b320 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20  belOk, r2,.     
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b340 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
1b350 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1b360 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1b370 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69  rageIf(v, ii<pLi
1b380 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
1b390 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b3a0 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73  geIf(v, ii==pLis
1b3b0 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
1b3c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b3d0 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
1b3e0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
1b3f0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
1b400 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  t( destIfNull==d
1b410 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20  estIfFalse );.  
1b420 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b430 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
1b440 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61  , rLhs, destIfFa
1b450 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lse, r2,.       
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
1b480 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64   P4_COLLSEQ); Vd
1b490 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b4a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b4b0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
1b4c0 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a  ff[0] | SQLITE_J
1b4d0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1b4e0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1b4f0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1b500 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65  pParse, regToFre
1b510 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
1b520 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20  ( regCkNull ){. 
1b530 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b540 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
1b550 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  ull, regCkNull, 
1b560 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
1b570 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b580 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1b590 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
1b5a0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se);.    }.    s
1b5b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1b5c0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f  eLabel(v, labelO
1b5d0 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  k);.    sqlite3R
1b5e0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1b5f0 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  arse, regCkNull)
1b600 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74  ;.    goto sqlit
1b610 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1b620 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ished;.  }..  /*
1b630 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74   Step 2: Check t
1b640 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53  o see if the LHS
1b650 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
1b660 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20  LL columns.  If 
1b670 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65  the.  ** LHS doe
1b680 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20  s contain NULLs 
1b690 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1b6a0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46  must be either F
1b6b0 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20  ALSE or NULL..  
1b6c0 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20  ** We will then 
1b6d0 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20  skip the binary 
1b6e0 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48  search of the RH
1b6f0 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
1b700 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
1b710 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73  False ){.    des
1b720 74 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46  tStep2 = destIfF
1b730 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  alse;.  }else{. 
1b740 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
1b750 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74  estStep6 = sqlit
1b760 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1b770 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 66  pParse);.  }.  f
1b780 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
1b790 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
1b7a0 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65  r *p = sqlite3Ve
1b7b0 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
1b7c0 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69  (pExpr->pLeft, i
1b7d0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
1b7e0 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
1b7f0 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  p) ){.      sqli
1b800 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b810 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73   OP_IsNull, rLhs
1b820 2b 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a  +i, destStep2);.
1b830 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b840 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ge(v);.    }.  }
1b850 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20  ..  /* Step 3.  
1b860 54 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b  The LHS is now k
1b870 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e  nown to be non-N
1b880 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e  ULL.  Do the bin
1b890 61 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20  ary search.  ** 
1b8a0 6f 66 20 74 68 65 20 52 48 53 20 75 73 69 6e 67  of the RHS using
1b8b0 20 74 68 65 20 4c 48 53 20 61 73 20 61 20 70 72   the LHS as a pr
1b8c0 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20  obe.  If found, 
1b8d0 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20  the result is.  
1b8e0 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  ** true..  */.  
1b8f0 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
1b900 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
1b910 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
1b920 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65  , the RHS is the
1b930 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20   ROWID of table 
1b940 62 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65  b-tree and so we
1b950 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f   also.    ** kno
1b960 77 20 74 68 61 74 20 74 68 65 20 52 48 53 20 69  w that the RHS i
1b970 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e  s non-NULL.  Hen
1b980 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73  ce, we combine s
1b990 74 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20  teps 3 and 4.   
1b9a0 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c   ** into a singl
1b9b0 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  e opcode. */.   
1b9c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b9d0 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
1b9e0 69 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66  id, iTab, destIf
1b9f0 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20  False, rLhs);.  
1ba00 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1ba10 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74 68  );.    addrTruth
1ba20 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
1ba30 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
1ba40 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54  o);  /* Return T
1ba50 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  rue */.  }else{.
1ba60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ba70 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
1ba80 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63  nity, rLhs, nVec
1ba90 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56  tor, 0, zAff, nV
1baa0 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ector);.    if( 
1bab0 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
1bac0 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  tIfNull ){.     
1bad0 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70   /* Combine Step
1bae0 20 33 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e   3 and Step 5 in
1baf0 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  to a single opco
1bb00 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  de */.      sqli
1bb10 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1bb20 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
1bb30 20 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c   iTab, destIfFal
1bb40 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1bb60 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56  Lhs, nVector); V
1bb70 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1bb80 20 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74        goto sqlit
1bb90 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1bba0 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ished;.    }.   
1bbb0 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65   /* Ordinary Ste
1bbc0 70 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73  p 3, for the cas
1bbd0 65 20 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e  e where FALSE an
1bbe0 64 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69  d NULL are disti
1bbf0 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54  nct */.    addrT
1bc00 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33  ruthOp = sqlite3
1bc10 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1bc20 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c   OP_Found, iTab,
1bc30 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20            rLhs, 
1bc60 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f  nVector); VdbeCo
1bc70 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
1bc80 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66    /* Step 4.  If
1bc90 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77   the RHS is know
1bca0 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  n to be non-NULL
1bcb0 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20   and we did not 
1bcc0 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74  find.  ** an mat
1bcd0 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68  ch on the search
1bce0 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
1bcf0 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
1bd00 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66  FALSE..  */.  if
1bd10 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26  ( rRhsHasNull &&
1bd20 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20   nVector==1 ){. 
1bd30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bd40 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
1bd50 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  ll, rRhsHasNull,
1bd60 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1bd70 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1bd80 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  v);.  }..  /* St
1bd90 65 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20  ep 5.  If we do 
1bda0 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
1bdb0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1bdc0 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20  tween NULL and. 
1bdd0 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20   ** FALSE, then 
1bde0 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73  just return fals
1bdf0 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e. .  */.  if( d
1be00 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1be10 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33  IfNull ) sqlite3
1be20 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
1be30 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20  IfFalse);..  /* 
1be40 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72  Step 6: Loop thr
1be50 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65  ough rows of the
1be60 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65   RHS.  Compare e
1be70 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c  ach row to the L
1be80 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20  HS..  ** If any 
1be90 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55  comparison is NU
1bea0 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  LL, then the res
1beb0 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66  ult is NULL.  If
1bec0 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72   all.  ** compar
1bed0 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20  isons are FALSE 
1bee0 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72  then the final r
1bef0 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a  esult is FALSE..
1bf00 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20    **.  ** For a 
1bf10 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69  scalar LHS, it i
1bf20 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
1bf30 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66  check just the f
1bf40 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66  irst row.  ** of
1bf50 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
1bf60 20 69 66 28 20 64 65 73 74 53 74 65 70 36 20 29   if( destStep6 )
1bf70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1bf80 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1bf90 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f  Step6);.  addrTo
1bfa0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
1bfb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
1bfc0 6e 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66  nd, iTab, destIf
1bfd0 46 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f  False);.  VdbeCo
1bfe0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
1bff0 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20   nVector>1 ){.  
1c000 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20    destNotNull = 
1c010 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1c020 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
1c030 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f  }else{.    /* Fo
1c040 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f  r nVector==1, co
1c050 6d 62 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e  mbine steps 6 an
1c060 64 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65  d 7 by immediate
1c070 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20  ly returning.   
1c080 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65   ** FALSE if the
1c090 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f   first compariso
1c0a0 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  n is not NULL */
1c0b0 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  .    destNotNull
1c0c0 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   = destIfFalse;.
1c0d0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1c0e0 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
1c0f0 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
1c100 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1c110 0a 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71  .    int r3 = sq
1c120 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1c130 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d  pParse);.    p =
1c140 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
1c150 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
1c160 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  , i);.    pColl 
1c170 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1c180 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
1c190 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c1a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1c1b0 75 6d 6e 2c 20 69 54 61 62 2c 20 69 2c 20 72 33  umn, iTab, i, r3
1c1c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1c1d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e  beAddOp4(v, OP_N
1c1e0 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e  e, rLhs+i, destN
1c1f0 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20  otNull, r3,.    
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c210 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
1c220 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
1c230 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1c240 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1c250 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1c260 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73  se, r3);.  }.  s
1c270 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c280 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1c290 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69  destIfNull);.  i
1c2a0 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a  f( nVector>1 ){.
1c2b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1c2c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1c2d0 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20  estNotNull);.   
1c2e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c2f0 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
1c300 54 61 62 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Tab, addrTop+1);
1c310 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1c320 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74  e(v);..    /* St
1c330 65 70 20 37 3a 20 20 49 66 20 77 65 20 72 65 61  ep 7:  If we rea
1c340 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  ch this point, w
1c350 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
1c360 72 65 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20  result must.    
1c370 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a  ** be false. */.
1c380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c390 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1c3a0 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65  , 0, destIfFalse
1c3b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
1c3c0 70 73 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72  ps here in order
1c3d0 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e   to return true.
1c3e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1c3f0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1c400 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69  rTruthOp);..sqli
1c410 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69  te3ExprCodeIN_fi
1c420 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c  nished:.  if( rL
1c430 68 73 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73  hs!=rLhsOrig ) s
1c440 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1c450 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68  pReg(pParse, rLh
1c460 73 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  s);.  VdbeCommen
1c470 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78  t((v, "end IN ex
1c480 70 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78  pr"));.sqlite3Ex
1c490 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72  prCodeIN_oom_err
1c4a0 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
1c4b0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1c4c0 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  aiMap);.  sqlite
1c4d0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
1c4e0 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e  db, zAff);.}.#en
1c4f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1c500 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
1c510 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c520 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1c530 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  NT./*.** Generat
1c540 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
1c550 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
1c560 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  he floating poin
1c570 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72  t.** value descr
1c580 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31  ibed by z[0..n-1
1c590 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
1c5a0 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iMem..**.** The 
1c5b0 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20  z[] string will 
1c5c0 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20  probably not be 
1c5d0 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
1c5e0 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b    But the .** z[
1c5f0 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20  n] character is 
1c600 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1c610 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
1c620 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a  does not look.**
1c630 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e   like the contin
1c640 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75  uation of the nu
1c650 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
1c660 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64  void codeReal(Vd
1c670 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
1c680 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65  r *z, int negate
1c690 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
1c6a0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21  .  if( ALWAYS(z!
1c6b0 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  =0) ){.    doubl
1c6c0 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c  e value;.    sql
1c6d0 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c  ite3AtoF(z, &val
1c6e0 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ue, sqlite3Strle
1c6f0 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
1c700 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TF8);.    assert
1c710 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  ( !sqlite3IsNaN(
1c720 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65  value) ); /* The
1c730 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20   new AtoF never 
1c740 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20  returns NaN */. 
1c750 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61     if( negateFla
1c760 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
1c770 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ue;.    sqlite3V
1c780 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
1c790 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65   OP_Real, 0, iMe
1c7a0 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75  m, 0, (u8*)&valu
1c7b0 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d  e, P4_REAL);.  }
1c7c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1c7d0 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
1c7e0 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
1c7f0 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65  ill put the inte
1c800 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a  ger describe by.
1c810 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31  ** text z[0..n-1
1c820 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
1c830 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72  iMem..**.** Expr
1c840 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77  .u.zToken is alw
1c850 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72  ays UTF8 and zer
1c860 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f  o-terminated..*/
1c870 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
1c880 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a  eInteger(Parse *
1c890 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1c8a0 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67  xpr, int negFlag
1c8b0 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56  , int iMem){.  V
1c8c0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1c8d0 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45  >pVdbe;.  if( pE
1c8e0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
1c8f0 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
1c900 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75  int i = pExpr->u
1c910 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73  .iValue;.    ass
1c920 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20  ert( i>=0 );.   
1c930 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69   if( negFlag ) i
1c940 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74   = -i;.    sqlit
1c950 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c960 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69  OP_Integer, i, i
1c970 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Mem);.  }else{. 
1c980 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36     int c;.    i6
1c990 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e  4 value;.    con
1c9a0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78  st char *z = pEx
1c9b0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1c9c0 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
1c9d0 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  ;.    c = sqlite
1c9e0 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
1c9f0 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69  , &value);.    i
1ca00 66 28 20 28 63 3d 3d 33 20 26 26 20 21 6e 65 67  f( (c==3 && !neg
1ca10 46 6c 61 67 29 20 7c 7c 20 28 63 3d 3d 32 29 20  Flag) || (c==2) 
1ca20 7c 7c 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76  || (negFlag && v
1ca30 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49  alue==SMALLEST_I
1ca40 4e 54 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53  NT64)){.#ifdef S
1ca50 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1ca60 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
1ca70 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1ca80 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a  pParse, "oversiz
1ca90 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73  ed integer: %s%s
1caa0 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22  ", negFlag ? "-"
1cab0 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65   : "", z);.#else
1cac0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cad0 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52  OMIT_HEX_INTEGER
1cae0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1caf0 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30  e3_strnicmp(z,"0
1cb00 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",2)==0 ){.    
1cb10 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1cb20 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68 65 78  Msg(pParse, "hex
1cb30 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67   literal too big
1cb40 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67  : %s%s", negFlag
1cb50 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20  ?"-":"",z);.    
1cb60 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1cb70 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63       {.        c
1cb80 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65  odeReal(v, z, ne
1cb90 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  gFlag, iMem);.  
1cba0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1cbb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
1cbc0 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c  ( negFlag ){ val
1cbd0 75 65 20 3d 20 63 3d 3d 33 20 3f 20 53 4d 41 4c  ue = c==3 ? SMAL
1cbe0 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61  LEST_INT64 : -va
1cbf0 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c  lue; }.      sql
1cc00 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
1cc10 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p8(v, OP_Int64, 
1cc20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a  0, iMem, 0, (u8*
1cc30 29 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36  )&value, P4_INT6
1cc40 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  4);.    }.  }.}.
1cc50 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1cc60 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61  de that will loa
1cc70 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  d into register 
1cc80 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74  regOut a value t
1cc90 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70  hat is.** approp
1cca0 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49  riate for the iI
1ccb0 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20  dxCol-th column 
1ccc0 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
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 4c 6f 61 64 49 6e 64 65 78 43  prCodeLoadIndexC
1ccf0 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1cd00 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20  pParse,  /* The 
1cd10 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1cd20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
1cd30 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  ,    /* The inde
1cd40 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69  x whose column i
1cd50 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  s to be loaded *
1cd60 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
1cd70 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1cd80 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  inting to a tabl
1cd90 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  e row */.  int i
1cda0 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68  IdxCol,    /* Th
1cdb0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1cdc0 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64  index to be load
1cdd0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ed */.  int regO
1cde0 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  ut      /* Store
1cdf0 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
1ce00 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  n value in this 
1ce10 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1ce20 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70   i16 iTabCol = p
1ce30 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49  Idx->aiColumn[iI
1ce40 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54  dxCol];.  if( iT
1ce50 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29  abCol==XN_EXPR )
1ce60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
1ce70 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a  dx->aColExpr );.
1ce80 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1ce90 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70  ->aColExpr->nExp
1cea0 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20  r>iIdxCol );.   
1ceb0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1cec0 62 20 3d 20 69 54 61 62 43 75 72 20 2b 20 31 3b  b = iTabCur + 1;
1ced0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1cee0 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c  CodeCopy(pParse,
1cef0 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1cf00 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70  >a[iIdxCol].pExp
1cf10 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20  r, regOut);.    
1cf20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1cf30 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1cf40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1cf50 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1cf60 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  le(pParse->pVdbe
1cf70 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20  , pIdx->pTable, 
1cf80 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20  iTabCur,.       
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
1cfb0 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCol, regOut);. 
1cfc0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1cfd0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74  rate code to ext
1cfe0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ract the value o
1cff0 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
1d000 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e  lumn of a table.
1d010 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d020 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1d030 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65  nOfTable(.  Vdbe
1d040 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *v,        /* T
1d050 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
1d060 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1d070 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1d080 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e  /* The table con
1d090 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
1d0a0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  e */.  int iTabC
1d0b0 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ur,    /* The ta
1d0c0 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20  ble cursor.  Or 
1d0d0 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f  the PK cursor fo
1d0e0 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
1d0f0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
1d100 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1d110 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65   the column to e
1d120 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20  xtract */.  int 
1d130 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45  regOut      /* E
1d140 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1d150 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
1d160 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ter */.){.  if( 
1d170 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
1d180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1d190 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
1d1a0 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65  TabCur, iCol, re
1d1b0 67 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72  gOut);.    retur
1d1c0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  n;.  }.  if( iCo
1d1d0 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61  l<0 || iCol==pTa
1d1e0 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
1d1f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d200 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
1d210 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b  TabCur, regOut);
1d220 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1d230 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c  t op = IsVirtual
1d240 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c  (pTab) ? OP_VCol
1d250 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b  umn : OP_Column;
1d260 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f  .    int x = iCo
1d270 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52  l;.    if( !HasR
1d280 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 21 49  owid(pTab) && !I
1d290 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1d2a0 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69  {.      x = sqli
1d2b0 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1d2c0 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b  (sqlite3PrimaryK
1d2d0 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69  eyIndex(pTab), i
1d2e0 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
1d2f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d300 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72  3(v, op, iTabCur
1d310 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  , x, regOut);.  
1d320 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
1d330 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
1d340 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
1d350 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75  Tab, iCol, regOu
1d360 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1d370 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1d380 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
1d390 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
1d3a0 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
1d3b0 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74  able pTab and st
1d3c0 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
1d3d0 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
1d3e0 20 69 52 65 67 2e 20 0a 2a 2a 0a 2a 2a 20 54 68   iReg. .**.** Th
1d3f0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
1d400 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54  pen cursor to pT
1d410 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65  ab in iTable whe
1d420 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
1d430 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66  * is called.  If
1d440 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20   iColumn<0 then 
1d450 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
1d460 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20  d that extracts 
1d470 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  the rowid..*/.in
1d480 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
1d490 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  eGetColumn(.  Pa
1d4a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
1d4b0 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1d4c0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1d4d0 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
1d4e0 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
1d4f0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1d500 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
1d510 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
1d520 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
1d530 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1d540 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
1d550 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1d560 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1d570 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
1d580 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1d590 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f  t iReg,        /
1d5a0 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
1d5b0 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20  here */.  u8 p5 
1d5c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35             /* P5
1d5d0 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f   value for OP_Co
1d5e0 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a  lumn + FLAGS */.
1d5f0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1d600 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1d610 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
1d620 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1d630 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1d640 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c  e(v, pTab, iTabl
1d650 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
1d660 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20  );.  if( p5 ){. 
1d670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1d680 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20  angeP5(v, p5);. 
1d690 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
1d6a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1d6b0 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65  ate code to move
1d6c0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65   content from re
1d6d0 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e  gisters iFrom...
1d6e0 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20  iFrom+nReg-1.** 
1d6f0 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f  over to iTo..iTo
1d700 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64  +nReg-1..*/.void
1d710 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d720 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  Move(Parse *pPar
1d730 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
1d740 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67  nt iTo, int nReg
1d750 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72  ){.  assert( iFr
1d760 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20  om>=iTo+nReg || 
1d770 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20  iFrom+nReg<=iTo 
1d780 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d790 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70  AddOp3(pParse->p
1d7a0 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69  Vdbe, OP_Move, i
1d7b0 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29  From, iTo, nReg)
1d7c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
1d7d0 72 74 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  rt a scalar expr
1d7e0 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61  ession node to a
1d7f0 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66   TK_REGISTER ref
1d800 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69  erencing.** regi
1d810 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 65 20  ster iReg.  The 
1d820 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
1d830 72 65 20 74 68 61 74 20 69 52 65 67 20 61 6c 72  re that iReg alr
1d840 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  eady contains.**
1d850 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1d860 75 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ue for the expre
1d870 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssion..*/.static
1d880 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69   void exprToRegi
1d890 73 74 65 72 28 45 78 70 72 20 2a 70 45 78 70 72  ster(Expr *pExpr
1d8a0 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 45  , int iReg){.  E
1d8b0 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
1d8c0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41  ExprSkipCollateA
1d8d0 6e 64 4c 69 6b 65 6c 79 28 70 45 78 70 72 29 3b  ndLikely(pExpr);
1d8e0 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f  .  p->op2 = p->o
1d8f0 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  p;.  p->op = TK_
1d900 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69  REGISTER;.  p->i
1d910 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20  Table = iReg;.  
1d920 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
1d930 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d  y(p, EP_Skip);.}
1d940 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65  ../*.** Evaluate
1d950 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28   an expression (
1d960 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20  either a vector 
1d970 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  or a scalar expr
1d980 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72  ession) and stor
1d990 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
1d9a0 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74  in continguous t
1d9b0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1d9c0 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  rs.  Return the 
1d9d0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
1d9e0 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 75  first register u
1d9f0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
1da00 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49   result..**.** I
1da10 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1da20 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
1da30 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63  s a temporary sc
1da40 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20  alar, then also 
1da50 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65  write.** that re
1da60 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e  gister number in
1da70 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20  to *piFreeable. 
1da80 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   If the returned
1da90 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
1daa0 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  .** is not a tem
1dab0 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68 65  porary or if the
1dac0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
1dad0 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46   vector set *piF
1dae0 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e  reeable.** to 0.
1daf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
1db00 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61  xprCodeVector(Pa
1db10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1db20 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65  r *p, int *piFre
1db30 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52  eable){.  int iR
1db40 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65  esult;.  int nRe
1db50 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  sult = sqlite3Ex
1db60 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b  prVectorSize(p);
1db70 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d  .  if( nResult==
1db80 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74  1 ){.    iResult
1db90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1dba0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1dbb0 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20  , piFreeable);. 
1dbc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46   }else{.    *piF
1dbd0 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  reeable = 0;.   
1dbe0 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   if( p->op==TK_S
1dbf0 45 4c 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c  ELECT ){.#if SQL
1dc00 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1dc10 59 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  Y.      iResult 
1dc20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  = 0;.#else.     
1dc30 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   iResult = sqlit
1dc40 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
1dc50 70 50 61 72 73 65 2c 20 70 29 3b 0a 23 65 6e 64  pParse, p);.#end
1dc60 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1dc70 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1dc80 20 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73   iResult = pPars
1dc90 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
1dca0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1dcb0 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20   nResult;.      
1dcc0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
1dcd0 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  lt; i++){.      
1dce0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1dcf0 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61 72  eFactorable(pPar
1dd00 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  se, p->x.pList->
1dd10 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52  a[i].pExpr, i+iR
1dd20 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a  esult);.      }.
1dd30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1dd40 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a  rn iResult;.}...
1dd50 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1dd60 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72  ode into the cur
1dd70 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61  rent Vdbe to eva
1dd80 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a  luate the given.
1dd90 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
1dda0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65  Attempt to store
1ddb0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1ddc0 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74  register "target
1ddd0 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  "..** Return the
1dde0 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20   register where 
1ddf0 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
1de00 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74  ed..**.** With t
1de10 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
1de20 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74  re is no guarant
1de30 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20  ee that results 
1de40 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65  will.** be store
1de50 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68  d in target.  Th
1de60 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62  e result might b
1de70 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65  e stored in some
1de80 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74   other.** regist
1de90 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76  er if it is conv
1dea0 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e  enient to do so.
1deb0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
1dec0 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63  nction.** must c
1ded0 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
1dee0 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  code and move th
1def0 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
1df00 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69   desired.** regi
1df10 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ster..*/.int sql
1df20 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1df30 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  et(Parse *pParse
1df40 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1df50 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
1df60 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1df70 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56  pVdbe;  /* The V
1df80 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  M under construc
1df90 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
1dfa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dfb0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
1dfc0 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
1dfd0 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74  .  int inReg = t
1dfe0 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  arget;       /* 
1dff0 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69  Results stored i
1e000 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67  n register inReg
1e010 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
1e020 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
1e030 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
1e040 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
1e050 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
1e060 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
1e070 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
1e080 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
1e090 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
1e0a0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1e0b0 72 31 2c 20 72 32 3b 20 20 20 20 20 20 20 20 20  r1, r2;         
1e0c0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
1e0d0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
1e0e0 73 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70  s */.  Expr temp
1e0f0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1e100 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78   /* Temporary ex
1e110 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f  pression node */
1e120 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a  .  int p5 = 0;..
1e130 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
1e140 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
1e150 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
1e160 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
1e170 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1e180 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e190 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
1e1a0 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f 63 6f 64 65  ;.  }..expr_code
1e1b0 5f 64 6f 6f 76 65 72 3a 0a 20 20 69 66 28 20 70  _doover:.  if( p
1e1c0 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  Expr==0 ){.    o
1e1d0 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d  p = TK_NULL;.  }
1e1e0 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70  else{.    op = p
1e1f0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20  Expr->op;.  }.  
1e200 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1e210 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
1e220 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  LUMN: {.      Ag
1e230 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
1e240 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
1e250 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
1e260 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
1e270 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
1e280 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  Col[pExpr->iAgg]
1e290 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
1e2a0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
1e2b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1e2c0 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e  ert( pCol->iMem>
1e2d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  0 );.        ret
1e2e0 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a  urn pCol->iMem;.
1e2f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e300 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
1e310 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
1e320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e330 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1e340 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72  n, pAggInfo->sor
1e350 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20  tingIdxPTab,.   
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e370 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1e380 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
1e390 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1e3a0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1e3b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
1e3c0 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
1e3d0 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
1e3e0 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
1e3f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e400 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
1e410 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45     int iTab = pE
1e420 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
1e430 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1e440 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e450 5f 46 69 78 65 64 43 6f 6c 29 20 29 7b 0a 20 20  _FixedCol) ){.  
1e460 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 43 4f        /* This CO
1e470 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  LUMN expression 
1e480 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6e 73  is really a cons
1e490 74 61 6e 74 20 64 75 65 20 74 6f 20 57 48 45 52  tant due to WHER
1e4a0 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  E clause.       
1e4b0 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c   ** constraints,
1e4c0 20 61 6e 64 20 74 68 61 74 20 63 6f 6e 73 74 61   and that consta
1e4d0 6e 74 20 69 73 20 63 6f 64 65 64 20 62 79 20 74  nt is coded by t
1e4e0 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 0a  he pExpr->pLeft.
1e4f0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
1e500 73 73 73 69 6f 6e 2e 20 20 48 6f 77 65 76 65 72  sssion.  However
1e510 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1e520 63 6f 6e 73 74 61 6e 74 20 68 61 73 20 74 68 65  constant has the
1e530 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 20   correct.       
1e540 20 2a 2a 20 64 61 74 61 74 79 70 65 20 62 79 20   ** datatype by 
1e550 61 70 70 6c 79 69 6e 67 20 74 68 65 20 41 66 66  applying the Aff
1e560 69 6e 69 74 79 20 6f 66 20 74 68 65 20 74 61 62  inity of the tab
1e570 6c 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65  le column to the
1e580 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  .        ** cons
1e590 74 61 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tant..        */
1e5a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 65  .        int iRe
1e5b0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1e5c0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1e5d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 74  , pExpr->pLeft,t
1e5e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1e5f0 69 6e 74 20 61 66 66 20 3d 20 73 71 6c 69 74 65  int aff = sqlite
1e600 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69  3TableColumnAffi
1e610 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54  nity(pExpr->y.pT
1e620 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ab, pExpr->iColu
1e630 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mn);.        if(
1e640 20 61 66 66 3e 53 51 4c 49 54 45 5f 41 46 46 5f   aff>SQLITE_AFF_
1e650 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
1e660 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1e670 68 61 72 20 7a 41 66 66 5b 5d 20 3d 20 22 42 5c  har zAff[] = "B\
1e680 30 30 30 43 5c 30 30 30 44 5c 30 30 30 45 22 3b  000C\000D\000E";
1e690 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1e6a0 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  t( SQLITE_AFF_BL
1e6b0 4f 42 3d 3d 27 41 27 20 29 3b 0a 20 20 20 20 20  OB=='A' );.     
1e6c0 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
1e6d0 49 54 45 5f 41 46 46 5f 54 45 58 54 3d 3d 27 42  ITE_AFF_TEXT=='B
1e6e0 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ' );.          i
1e6f0 66 28 20 69 52 65 67 21 3d 74 61 72 67 65 74 20  f( iReg!=target 
1e700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1e710 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e720 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 52  (v, OP_SCopy, iR
1e730 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
1e740 20 20 20 20 20 20 20 20 20 69 52 65 67 20 3d 20           iReg = 
1e750 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 20 20  target;.        
1e760 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
1e770 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1e780 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
1e790 69 52 65 67 2c 20 31 2c 20 30 2c 0a 20 20 20 20  iReg, 1, 0,.    
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7b0 20 20 20 20 20 20 20 20 26 7a 41 66 66 5b 28 61          &zAff[(a
1e7c0 66 66 2d 27 42 27 29 2a 32 5d 2c 20 50 34 5f 53  ff-'B')*2], P4_S
1e7d0 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
1e7e0 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
1e7f0 20 69 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20   iReg;.      }. 
1e800 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20       if( iTab<0 
1e810 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1e820 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c  Parse->iSelfTab<
1e830 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1e840 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1e850 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1e860 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1e870 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1e880 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
1e890 72 74 28 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  rt( pExpr->y.pTa
1e8a0 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b!=0 );.        
1e8b0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e8c0 3e 69 43 6f 6c 75 6d 6e 3e 3d 58 4e 5f 52 4f 57  >iColumn>=XN_ROW
1e8d0 49 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ID );.          
1e8e0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
1e8f0 43 6f 6c 75 6d 6e 3c 70 45 78 70 72 2d 3e 79 2e  Column<pExpr->y.
1e900 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
1e910 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
1e920 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  r->iColumn>=0.  
1e930 20 20 20 20 20 20 20 20 20 20 26 26 20 70 45 78            && pEx
1e940 70 72 2d 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c  pr->y.pTab->aCol
1e950 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1e960 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
1e970 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
1e980 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1e990 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e9a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1e9b0 79 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  y, pExpr->iColum
1e9c0 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  n - pParse->iSel
1e9d0 66 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  fTab,.          
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9f0 20 20 20 20 74 61 72 67 65 74 29 3b 0a 20 20 20      target);.   
1ea00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ea10 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1ea20 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74  _RealAffinity, t
1ea30 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1ea40 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1ea50 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  t;.          }el
1ea60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1ea70 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 43  return pExpr->iC
1ea80 6f 6c 75 6d 6e 20 2d 20 70 50 61 72 73 65 2d 3e  olumn - pParse->
1ea90 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20  iSelfTab;.      
1eaa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1eab0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1eac0 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1ead0 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1eae0 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1eaf0 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1eb00 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1eb10 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1eb20 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1eb30 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1eb40 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1eb50 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1eb60 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1eb70 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 1;.        }. 
1eb80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1eb90 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1eba0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1ebb0 72 73 65 2c 20 70 45 78 70 72 2d 3e 79 2e 70 54  rse, pExpr->y.pT
1ebc0 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
1ebf0 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c  n, iTab, target,
1ec00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20  pExpr->op2);.   
1ec30 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1ec40 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
1ec50 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
1ec60 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61  se, pExpr, 0, ta
1ec70 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1ec80 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1ec90 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
1eca0 55 45 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20  UEFALSE: {.     
1ecb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ecc0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1ecd0 2c 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  , sqlite3ExprTru
1ece0 74 68 56 61 6c 75 65 28 70 45 78 70 72 29 2c 20  thValue(pExpr), 
1ecf0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1ed00 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1ed10 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1ed20 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1ed30 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
1ed40 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
1ed50 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1ed60 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1ed70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1ed80 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  ;.      codeReal
1ed90 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (v, pExpr->u.zTo
1eda0 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ken, 0, target);
1edb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1edc0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
1edd0 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  if.    case TK_S
1ede0 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61  TRING: {.      a
1edf0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1ee00 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1ee10 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1ee20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ee30 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61  LoadString(v, ta
1ee40 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  rget, pExpr->u.z
1ee50 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72 65  Token);.      re
1ee60 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1ee70 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1ee80 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
1ee90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1eea0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
1eeb0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1eec0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1eed0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1eee0 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
1eef0 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
1ef00 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
1ef10 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
1ef20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
1ef30 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
1ef40 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1ef50 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1ef60 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1ef70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ef80 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1ef90 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72  0]=='x' || pExpr
1efa0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1efb0 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
1efc0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1efd0 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ken[1]=='\'' );.
1efe0 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72        z = &pExpr
1eff0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
1f000 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
1f010 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b  Strlen30(z) - 1;
1f020 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1f030 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [n]=='\'' );.   
1f040 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
1f050 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
1f060 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
1f070 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
1f080 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1f090 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
1f0a0 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
1f0b0 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
1f0c0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1f0d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1f0e0 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
1f0f0 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  BLE: {.      ass
1f100 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1f110 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1f120 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1f130 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1f140 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b  ->u.zToken!=0 );
1f150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f160 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1f170 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  ]!=0 );.      sq
1f180 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f190 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
1f1a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
1f1b0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
1f1c0 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
1f1d0 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
1f1e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1f1f0 7a 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74  z = sqlite3VList
1f200 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65  NumToName(pParse
1f210 2d 3e 70 56 4c 69 73 74 2c 20 70 45 78 70 72 2d  ->pVList, pExpr-
1f220 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1f230 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1f240 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1f250 3f 27 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78  ?' || strcmp(pEx
1f260 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29  pr->u.zToken, z)
1f270 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
1f280 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d  Parse->pVList[0]
1f290 20 3d 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74   = 0; /* Indicat
1f2a0 65 20 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c  e VList may no l
1f2b0 6f 6e 67 65 72 20 62 65 20 65 6e 6c 61 72 67 65  onger be enlarge
1f2c0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  d */.        sql
1f2d0 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
1f2e0 28 76 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50 34  (v, (char*)z, P4
1f2f0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
1f300 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  }.      return t
1f310 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
1f320 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1f330 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
1f340 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  n pExpr->iTable;
1f350 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1f360 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
1f370 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
1f380 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
1f390 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
1f3a0 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
1f3b0 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
1f3c0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
1f3d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1f3e0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1f3f0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
1f400 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
1f410 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
1f420 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f430 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
1f440 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
1f450 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
1f460 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
1f470 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1f480 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f490 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c  OP_Cast, target,
1f4a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f4b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f4c0 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
1f4d0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
1f4e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f4f0 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e  inReg;.    }.#en
1f500 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1f510 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63  IT_CAST */.    c
1f520 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1f530 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
1f540 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
1f550 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
1f560 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d  K_NE;.      p5 =
1f570 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a   SQLITE_NULLEQ;.
1f580 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68        /* fall-th
1f590 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
1f5a0 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
1f5b0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
1f5c0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
1f5d0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
1f5e0 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
1f5f0 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
1f600 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
1f610 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
1f620 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1f630 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74  prIsVector(pLeft
1f640 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) ){.        cod
1f650 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70  eVectorCompare(p
1f660 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1f670 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20  rget, op, p5);. 
1f680 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f690 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f6a0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f6b0 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67  rse, pLeft, &reg
1f6c0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
1f6d0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1f6e0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f6f0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1f700 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1f710 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1f720 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
1f730 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1f740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31  ,.            r1
1f750 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c  , r2, inReg, SQL
1f760 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35  ITE_STOREP2 | p5
1f770 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f780 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
1f790 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f7a0 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
1f7b0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
1f7c0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f7d0 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
1f7e0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f7f0 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
1f800 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
1f810 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f820 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
1f830 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f840 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
1f850 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
1f860 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f870 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
1f880 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f890 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
1f8a0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
1f8b0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f8c0 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
1f8d0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f8e0 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Eq); VdbeCovera
1f8f0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71  geIf(v,op==OP_Eq
1f900 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f910 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
1f920 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f930 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ne); VdbeCovera
1f940 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65  geIf(v,op==OP_Ne
1f950 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f960 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f970 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1f980 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1f990 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1f9a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f9b0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1f9c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1f9d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
1f9e0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
1f9f0 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
1fa00 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
1fa10 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
1fa20 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
1fa30 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
1fa40 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
1fa50 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
1fa60 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
1fa70 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
1fa80 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
1fa90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1faa0 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
1fab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ;            tes
1fac0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e  tcase( op==TK_AN
1fad0 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
1fae0 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
1faf0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1fb00 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1fb10 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OR );.      ass
1fb20 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50  ert( TK_PLUS==OP
1fb30 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20 20  _Add );         
1fb40 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fb50 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20  TK_PLUS );.     
1fb60 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55   assert( TK_MINU
1fb70 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29  S==OP_Subtract )
1fb80 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;     testcase( 
1fb90 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a  op==TK_MINUS );.
1fba0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1fbb0 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
1fbc0 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  er );      testc
1fbd0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20  ase( op==TK_REM 
1fbe0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fbf0 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42   TK_BITAND==OP_B
1fc00 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65  itAnd );      te
1fc10 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1fc20 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  ITAND );.      a
1fc30 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d  ssert( TK_BITOR=
1fc40 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20  =OP_BitOr );    
1fc50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1fc60 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20  ==TK_BITOR );.  
1fc70 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
1fc80 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
1fc90 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61 73  );       testcas
1fca0 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20  e( op==TK_SLASH 
1fcb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fcc0 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
1fcd0 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65  hiftLeft );   te
1fce0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1fcf0 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
1fd00 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
1fd10 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
1fd20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
1fd30 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20  ==TK_RSHIFT );. 
1fd40 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1fd50 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
1fd60 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  t );      testca
1fd70 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41  se( op==TK_CONCA
1fd80 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1fd90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1fda0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1fdb0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1fdc0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1fdd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fde0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1fdf0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1fe00 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
1fe10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1fe20 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
1fe30 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
1fe40 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1fe50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1fe60 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1fe70 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1fe80 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1fe90 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
1fea0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1feb0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
1fec0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fed0 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
1fee0 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
1fef0 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
1ff00 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
1ff10 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c  Parse, pLeft, 1,
1ff20 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1ff30 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1ff40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ff50 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1ff60 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  INT.      }else 
1ff70 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
1ff80 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  K_FLOAT ){.     
1ff90 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1ffa0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ffb0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1ffc0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52  );.        codeR
1ffd0 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e  eal(v, pLeft->u.
1ffe0 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65  zToken, 1, targe
1fff0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
20000 72 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69  rn target;.#endi
20010 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
20020 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20         tempX.op 
20030 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20  = TK_INTEGER;.  
20040 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67        tempX.flag
20050 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c  s = EP_IntValue|
20060 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20  EP_TokenOnly;.  
20070 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56        tempX.u.iV
20080 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  alue = 0;.      
20090 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
200a0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
200b0 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46  e, &tempX, &regF
200c0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ree1);.        r
200d0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
200e0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
200f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
20100 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
20110 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20120 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
20130 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
20140 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  et);.        tes
20150 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
20160 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
20170 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20180 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
20190 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
201a0 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
201b0 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
201c0 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20  =OP_BitNot );   
201d0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
201e0 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20  _BITNOT );.     
201f0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d   assert( TK_NOT=
20200 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20  =OP_Not );      
20210 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20220 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_NOT );.     
20230 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
20240 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
20250 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
20260 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
20270 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
20280 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
20290 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
202a0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e  p2(v, op, r1, in
202b0 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
202c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
202d0 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20  e TK_TRUTH: {.  
202e0 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20      int isTrue; 
202f0 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72     /* IS TRUE or
20300 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a   IS NOT TRUE */.
20310 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 72 6d 61        int bNorma
20320 6c 3b 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20  l;   /* IS TRUE 
20330 6f 72 20 49 53 20 46 41 4c 53 45 20 2a 2f 0a 20  or IS FALSE */. 
20340 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
20350 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
20360 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
20370 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
20380 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20390 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
203a0 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71       isTrue = sq
203b0 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
203c0 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  lue(pExpr->pRigh
203d0 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72 6d 61  t);.      bNorma
203e0 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d  l = pExpr->op2==
203f0 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74 65 73  TK_IS;.      tes
20400 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
20410 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
20420 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72   testcase( !isTr
20430 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a  ue && bNormal);.
20440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20450 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
20460 5f 49 73 54 72 75 65 2c 20 72 31 2c 20 69 6e 52  _IsTrue, r1, inR
20470 65 67 2c 20 21 69 73 54 72 75 65 2c 20 69 73 54  eg, !isTrue, isT
20480 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b 0a  rue ^ bNormal);.
20490 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
204a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
204b0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
204c0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
204d0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
204e0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
204f0 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
20500 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
20510 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
20520 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
20530 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
20540 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
20550 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
20560 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
20570 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20580 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
20590 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31  arget);.      r1
205a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
205b0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
205c0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
205d0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
205e0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
205f0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  1==0 );.      ad
20600 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
20610 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
20620 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
20630 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
20640 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
20650 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
20660 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
20670 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
20680 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20690 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61  P_Integer, 0, ta
206a0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
206b0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
206c0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
206d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
206e0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
206f0 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
20700 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
20710 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
20720 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
20730 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
20740 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
20750 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
20760 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
20770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20780 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
20790 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
207a0 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78  gate: %s()", pEx
207b0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
207c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
207d0 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f      return pInfo
207e0 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69  ->aFunc[pExpr->i
207f0 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20  Agg].iMem;.     
20800 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
20810 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
20820 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
20830 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46      ExprList *pF
20840 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  arg;       /* Li
20850 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
20860 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
20870 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20    int nFarg;    
20880 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20890 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  er of function a
208a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
208b0 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
208c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
208d0 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
208e0 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
208f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20900 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  zId;       /* Th
20910 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
20920 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e  */.      u32 con
20930 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  stMask = 0;     
20940 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74  /* Mask of funct
20950 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68  ion arguments th
20960 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20  at are constant 
20970 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
209a0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
209b0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
209c0 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  b;  /* The datab
209d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
209e0 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
209f0 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
20a00 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
20a10 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
20a20 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
20a30 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
20a40 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
20a50 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
20a60 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  e */..#ifndef SQ
20a70 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
20a80 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45  FUNC.      if( E
20a90 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20aa0 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63  Expr, EP_WinFunc
20ab0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
20ac0 75 72 6e 20 70 45 78 70 72 2d 3e 79 2e 70 57 69  urn pExpr->y.pWi
20ad0 6e 2d 3e 72 65 67 52 65 73 75 6c 74 3b 0a 20 20  n->regResult;.  
20ae0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
20af0 20 20 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63      if( ConstFac
20b00 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 26 26  torOk(pParse) &&
20b10 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
20b20 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45  nstantNotJoin(pE
20b30 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
20b40 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  /* SQL functions
20b50 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76   can be expensiv
20b60 65 2e 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76  e. So try to mov
20b70 65 20 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74  e constant funct
20b80 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ions.        ** 
20b90 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
20ba0 20 6c 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20 74   loop, even if t
20bb0 68 61 74 20 6d 65 61 6e 73 20 61 6e 20 65 78 74  hat means an ext
20bc0 72 61 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20  ra OP_Copy. */. 
20bd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
20be0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
20bf0 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
20c00 72 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  r, -1);.      }.
20c10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
20c20 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20c30 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
20c40 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
20c50 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
20c60 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
20c70 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
20c80 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20   pFarg = 0;.    
20c90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20ca0 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e   pFarg = pExpr->
20cb0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d  x.pList;.      }
20cc0 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70  .      nFarg = p
20cd0 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45  Farg ? pFarg->nE
20ce0 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61  xpr : 0;.      a
20cf0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
20d00 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
20d10 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
20d20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72       zId = pExpr
20d30 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
20d40 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
20d50 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
20d60 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63   zId, nFarg, enc
20d70 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  , 0);.#ifdef SQL
20d80 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f  ITE_ENABLE_UNKNO
20d90 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a  WN_SQL_FUNCTION.
20da0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
20db0 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70  0 && pParse->exp
20dc0 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lain ){.        
20dd0 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
20de0 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  ndFunction(db, "
20df0 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c  unknown", nFarg,
20e00 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
20e10 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
20e20 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44  f( pDef==0 || pD
20e30 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30  ef->xFinalize!=0
20e40 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20e50 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
20e60 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e  se, "unknown fun
20e70 63 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49  ction: %s()", zI
20e80 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
20e90 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
20ea0 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64    /* Attempt a d
20eb0 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61  irect implementa
20ec0 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
20ed0 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20  t-in COALESCE() 
20ee0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e  and.      ** IFN
20ef0 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  ULL() functions.
20f00 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e    This avoids un
20f10 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 75 61  necessary evalua
20f20 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tion of.      **
20f30 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20   arguments past 
20f40 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55  the first non-NU
20f50 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  LL argument..   
20f60 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
20f70 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20f80 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  & SQLITE_FUNC_CO
20f90 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20  ALESCE ){.      
20fa0 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63    int endCoalesc
20fb0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
20fc0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
20fd0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20fe0 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20  ( nFarg>=2 );.  
20ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21000 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
21010 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
21020 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21030 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61    for(i=1; i<nFa
21040 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
21050 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21060 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
21070 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64  ull, target, end
21080 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
21090 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
210a0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
210b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
210c0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
210d0 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [i].pExpr, targe
210e0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
210f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21100 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
21110 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
21120 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21130 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
21140 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66  The UNLIKELY() f
21150 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
21160 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  op.  The result 
21170 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  is the value.   
21180 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
21190 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
211a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
211b0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
211c0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e  & SQLITE_FUNC_UN
211d0 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20  LIKELY ){.      
211e0 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
211f0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  =1 );.        re
21200 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
21210 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
21220 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
21230 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
21240 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
21250 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
21260 20 20 2f 2a 20 54 68 65 20 41 46 46 49 4e 49 54    /* The AFFINIT
21270 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 65 76 61  Y() function eva
21280 6c 75 61 74 65 73 20 74 6f 20 61 20 73 74 72 69  luates to a stri
21290 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
212a0 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74  s.      ** the t
212b0 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  ype affinity of 
212c0 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  the argument.  T
212d0 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
212e0 74 65 73 74 69 6e 67 20 6f 66 0a 20 20 20 20 20  testing of.     
212f0 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 74   ** the SQLite t
21300 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20 20 20 20  ype logic..     
21310 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
21320 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
21330 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46 49  SQLITE_FUNC_AFFI
21340 4e 49 54 59 20 29 7b 0a 20 20 20 20 20 20 20 20  NITY ){.        
21350 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 66  const char *azAf
21360 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62 22 2c 20  f[] = { "blob", 
21370 22 74 65 78 74 22 2c 20 22 6e 75 6d 65 72 69 63  "text", "numeric
21380 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 22 72  ", "integer", "r
21390 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20 20 20 20  eal" };.        
213a0 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20 20  char aff;.      
213b0 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d    assert( nFarg=
213c0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 66  =1 );.        af
213d0 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
213e0 66 66 69 6e 69 74 79 28 70 46 61 72 67 2d 3e 61  ffinity(pFarg->a
213f0 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
21400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
21410 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72  oadString(v, tar
21420 67 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  get, .          
21430 20 20 20 20 20 20 28 61 66 66 3c 3d 53 51 4c 49        (aff<=SQLI
21440 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 20 3f 20 22  TE_AFF_NONE) ? "
21450 6e 6f 6e 65 22 20 3a 20 61 7a 41 66 66 5b 61 66  none" : azAff[af
21460 66 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  f-SQLITE_AFF_BLO
21470 42 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  B]);.        ret
21480 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
21490 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
214a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61    for(i=0; i<nFa
214b0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
214c0 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71    if( i<32 && sq
214d0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
214e0 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  ant(pFarg->a[i].
214f0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
21500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
21510 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
21520 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41   constMask |= MA
21530 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20  SKBIT32(i);.    
21540 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21550 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
21560 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
21570 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26  _NEEDCOLL)!=0 &&
21580 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
21590 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
215a0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
215b0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
215c0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
215d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
215e0 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
215f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e  .        if( con
21600 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20  stMask ){.      
21610 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d      r1 = pParse-
21620 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
21630 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
21640 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20  += nFarg;.      
21650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21660 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
21670 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
21680 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
21690 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
216a0 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61  * For length() a
216b0 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  nd typeof() func
216c0 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c  tions with a col
216d0 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20  umn argument,.  
216e0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65        ** set the
216f0 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f   P5 parameter to
21700 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   the OP_Column o
21710 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f  pcode to OPFLAG_
21720 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20  LENGTHARG.      
21730 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54    ** or OPFLAG_T
21740 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74  YPEOFARG respect
21750 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20  ively, to avoid 
21760 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61  unnecessary data
21770 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64  .        ** load
21780 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
21790 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
217a0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
217b0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
217c0 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  TH|SQLITE_FUNC_T
217d0 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20  YPEOF))!=0 ){.  
217e0 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f          u8 exprO
217f0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
21800 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
21810 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
21820 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  t( pFarg->a[0].p
21830 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
21840 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46       exprOp = pF
21850 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
21860 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  >op;.          i
21870 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f  f( exprOp==TK_CO
21880 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d  LUMN || exprOp==
21890 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
218a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
218b0 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
218c0 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f  _LENGTH==OPFLAG_
218d0 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
218e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
218f0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
21900 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45  EOF==OPFLAG_TYPE
21910 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  OFARG );.       
21920 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21930 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
21940 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
21950 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
21960 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21970 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20  pr->op2 = .     
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
21990 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
219a0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
219b0 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  |OPFLAG_TYPEOFAR
219c0 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  G);.          }.
219d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
219e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
219f0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
21a00 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 30 2c  e, pFarg, r1, 0,
21a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a30 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
21a40 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  |SQLITE_ECEL_FAC
21a50 54 4f 52 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  TOR);.      }els
21a60 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
21a70 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
21a80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
21a90 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
21aa0 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76    /* Possibly ov
21ab0 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74  erload the funct
21ac0 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ion if the first
21ad0 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20   argument is.   
21ae0 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20     ** a virtual 
21af0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  table column..  
21b00 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21b10 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69  For infix functi
21b20 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c  ons (LIKE, GLOB,
21b30 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54   REGEXP, and MAT
21b40 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20  CH) use the.    
21b50 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75    ** second argu
21b60 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69  ment, not the fi
21b70 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75  rst, as the argu
21b80 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a  ment to test to.
21b90 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
21ba0 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  it is a column i
21bb0 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  n a virtual tabl
21bc0 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65  e.  This is done
21bd0 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a   because.      *
21be0 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  * the left opera
21bf0 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63  nd of infix func
21c00 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61  tions (the opera
21c10 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20  nd we want to.  
21c20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f      ** control o
21c30 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73  verloading) ends
21c40 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e   up as the secon
21c50 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
21c60 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  e.      ** funct
21c70 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73  ion.  The expres
21c80 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  sion "A glob B" 
21c90 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
21ca0 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62   .      ** "glob
21cb0 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20  (B,A).  We want 
21cc0 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20  to use the A in 
21cd0 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65  "A glob B" to te
21ce0 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  st.      ** for 
21cf0 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61  function overloa
21d00 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73  ding.  But we us
21d10 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20  e the B term in 
21d20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20  "glob(B,A)"..   
21d30 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
21d40 6e 46 61 72 67 3e 3d 32 20 26 26 20 45 78 70 72  nFarg>=2 && Expr
21d50 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
21d60 72 2c 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29  r, EP_InfixFunc)
21d70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
21d80 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
21d90 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
21da0 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
21db0 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
21dc0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
21dd0 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
21de0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
21df0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
21e00 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
21e10 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
21e20 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
21e30 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
21e40 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
21e50 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
21e60 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
21e70 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
21e80 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
21e90 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
21ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21eb0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
21ec0 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
21ed0 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
21ee0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
21ef0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
21f00 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
21f10 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20  _SQL_FUNC.      
21f20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
21f30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
21f40 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20 20 20  C_OFFSET ){.    
21f50 20 20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d      Expr *pArg =
21f60 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21f70 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
21f80 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  pArg->op==TK_COL
21f90 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
21fa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21fb0 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c  p3(v, OP_Offset,
21fc0 20 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70   pArg->iTable, p
21fd0 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  Arg->iColumn, ta
21fe0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
21ff0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22000 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22010 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
22020 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
22030 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a    }.      }else.
22040 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
22050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22060 62 65 41 64 64 4f 70 34 28 76 2c 20 70 50 61 72  beAddOp4(v, pPar
22070 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f  se->iSelfTab ? O
22080 50 5f 50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50  P_PureFunc0 : OP
22090 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20  _Function0,.    
220a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220b0 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c        constMask,
220c0 20 72 31 2c 20 74 61 72 67 65 74 2c 20 28 63 68   r1, target, (ch
220d0 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e  ar*)pDef, P4_FUN
220e0 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73  CDEF);.        s
220f0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
22100 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
22110 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22120 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e  if( nFarg && con
22130 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20  stMask==0 ){.   
22140 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
22150 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
22160 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
22170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
22180 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
22190 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
221a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
221b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
221c0 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
221d0 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
221e0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
221f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
22200 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
22210 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
22220 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
22230 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45     if( op==TK_SE
22240 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20  LECT && (nCol = 
22250 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
22260 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
22270 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
22280 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
22290 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f  rror(pParse, nCo
222a0 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 1);.      }el
222b0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
222c0 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  rn sqlite3CodeSu
222d0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
222e0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
222f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22300 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
22310 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  ELECT_COLUMN: {.
22320 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
22330 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
22340 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  eft->iTable==0 )
22350 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
22360 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d  >pLeft->iTable =
22370 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
22380 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
22390 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
223a0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
223b0 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
223c0 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c  ==0 || pExpr->pL
223d0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  eft->op==TK_SELE
223e0 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
223f0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 30  pExpr->iTable!=0
22400 0a 20 20 20 20 20 20 20 26 26 20 70 45 78 70 72  .       && pExpr
22410 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73  ->iTable!=(n = s
22420 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
22430 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  Size(pExpr->pLef
22440 74 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  t)).      ){.   
22450 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
22460 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
22470 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65   columns assigne
22480 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  d %d values",.  
22490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
224b0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b  xpr->iTable, n);
224c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
224d0 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65  eturn pExpr->pLe
224e0 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78  ft->iTable + pEx
224f0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
22500 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
22510 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
22520 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
22530 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
22540 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
22550 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
22560 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
22570 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
22580 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22590 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
225a0 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
225b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
225c0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
225d0 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
225e0 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
225f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22600 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
22610 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
22620 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
22630 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
22640 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
22650 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22660 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22670 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
22680 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
22690 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
226a0 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
226b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
226c0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65  target;.    }.#e
226d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
226e0 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
226f0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
22700 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
22710 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
22720 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
22730 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
22740 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
22750 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
22760 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
22770 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
22780 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
22790 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
227a0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
227b0 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
227c0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
227d0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
227e0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
227f0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
22800 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
22810 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
22820 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c  Expr, target, 0,
22830 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
22840 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
22850 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
22860 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
22870 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65  LLATE: .    case
22880 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
22890 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
228a0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 67  ->pLeft;.      g
228b0 6f 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f  oto expr_code_do
228c0 6f 76 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30 34  over; /* 2018-04
228d0 2d 32 38 3a 20 50 72 65 76 65 6e 74 20 64 65 65  -28: Prevent dee
228e0 70 20 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53 53  p recursion. OSS
228f0 46 75 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a  Fuzz. */.    }..
22900 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
22910 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
22920 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
22930 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
22940 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
22950 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
22960 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
22970 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
22980 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
22990 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
229a0 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
229b0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
229c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
229d0 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
229e0 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
229f0 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
22a00 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
22a10 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
22a20 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
22a30 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
22a40 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
22a50 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
22a60 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
22a70 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
22a80 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
22a90 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
22aa0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
22ab0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
22ac0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
22ad0 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
22ae0 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
22af0 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
22b00 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
22b10 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
22b20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
22b30 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
22b40 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
22b50 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
22b60 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
22b70 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
22b80 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
22b90 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
22ba0 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
22bb0 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
22bc0 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
22bd0 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
22be0 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
22bf0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
22c00 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
22c10 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
22c20 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
22c30 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
22c40 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
22c50 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
22c60 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
22c70 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
22c80 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
22c90 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
22ca0 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
22cb0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
22cc0 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
22cd0 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
22ce0 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
22cf0 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
22d00 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
22d10 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
22d20 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
22d30 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
22d40 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
22d50 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
22d60 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
22d70 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
22d80 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
22d90 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
22da0 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
22db0 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
22dc0 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
22dd0 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
22de0 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
22df0 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
22e00 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
22e10 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
22e20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
22e30 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
22e40 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
22e50 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20  b;.      int p1 
22e60 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
22e70 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  * (pTab->nCol+1)
22e80 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43   + 1 + pExpr->iC
22e90 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73  olumn;..      as
22ea0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
22eb0 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
22ec0 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  >iTable==1 );.  
22ed0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
22ee0 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26  r->iColumn>=-1 &
22ef0 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
22f00 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
22f10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
22f20 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45  b->iPKey<0 || pE
22f30 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54  xpr->iColumn!=pT
22f40 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20  ab->iPKey );.   
22f50 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30     assert( p1>=0
22f60 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43   && p1<(pTab->nC
22f70 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20  ol*2+2) );..    
22f80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22f90 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c  Op2(v, OP_Param,
22fa0 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   p1, target);.  
22fb0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22fc0 28 76 2c 20 22 72 5b 25 64 5d 3d 25 73 2e 25 73  (v, "r[%d]=%s.%s
22fd0 22 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  ", target,.     
22fe0 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c     (pExpr->iTabl
22ff0 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64  e ? "new" : "old
23000 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  "),.        (pEx
23010 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20  pr->iColumn<0 ? 
23020 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d  "rowid" : pExpr-
23030 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  >y.pTab->aCol[pE
23040 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e  xpr->iColumn].zN
23050 61 6d 65 29 0a 20 20 20 20 20 20 29 29 3b 0a 0a  ame).      ));..
23060 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23070 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
23080 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  NT.      /* If t
23090 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45  he column has RE
230a0 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20  AL affinity, it 
230b0 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
230c0 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20   stored as an.  
230d0 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
230e0 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  Use OP_RealAffin
230f0 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ity to make sure
23100 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
23110 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  al..      **.   
23120 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
23130 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32  F: R-60985-57662
23140 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e   SQLite will con
23150 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62  vert the value b
23160 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ack to.      ** 
23170 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77  floating point w
23180 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69  hen extracting i
23190 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72  t from the recor
231a0 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
231b0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
231c0 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54  =0 .       && pT
231d0 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
231e0 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
231f0 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
23200 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  AL.      ){.    
23210 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23220 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
23230 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74  Affinity, target
23240 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
23250 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
23260 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
23270 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20  K_VECTOR: {.    
23280 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23290 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
232a0 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
232b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
232c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 4b 5f 49 46   }..    /* TK_IF
232d0 5f 4e 55 4c 4c 5f 52 4f 57 20 45 78 70 72 20 6e  _NULL_ROW Expr n
232e0 6f 64 65 73 20 61 72 65 20 69 6e 73 65 72 74 65  odes are inserte
232f0 64 20 61 68 65 61 64 20 6f 66 20 65 78 70 72 65  d ahead of expre
23300 73 73 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 74 68  ssions.    ** th
23310 61 74 20 64 65 72 69 76 65 20 66 72 6f 6d 20 74  at derive from t
23320 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61  he right-hand ta
23330 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
23340 49 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  IN.  The.    ** 
23350 45 78 70 72 2e 69 54 61 62 6c 65 20 76 61 6c 75  Expr.iTable valu
23360 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  e is the table n
23370 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 69  umber for the ri
23380 67 68 74 2d 68 61 6e 64 20 74 61 62 6c 65 2e 0a  ght-hand table..
23390 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65      ** The expre
233a0 73 73 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76  ssion is only ev
233b0 61 6c 75 61 74 65 64 20 69 66 20 74 68 61 74 20  aluated if that 
233c0 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 63 75 72  table is not cur
233d0 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6f 6e  rently.    ** on
233e0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 4e 55 4c   a LEFT JOIN NUL
233f0 4c 20 72 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  L row..    */.  
23400 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c    case TK_IF_NUL
23410 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69  L_ROW: {.      i
23420 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20  nt addrINR;.    
23430 20 20 75 38 20 6f 6b 43 6f 6e 73 74 46 61 63 74    u8 okConstFact
23440 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6f 6b 43  or = pParse->okC
23450 6f 6e 73 74 46 61 63 74 6f 72 3b 0a 20 20 20 20  onstFactor;.    
23460 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69    addrINR = sqli
23470 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
23480 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70   OP_IfNullRow, p
23490 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
234a0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
234b0 69 6c 79 20 64 69 73 61 62 6c 65 20 66 61 63 74  ily disable fact
234c0 6f 72 69 6e 67 20 6f 66 20 63 6f 6e 73 74 61 6e  oring of constan
234d0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  t expressions, s
234e0 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  ince.      ** ev
234f0 65 6e 20 74 68 6f 75 67 68 20 65 78 70 72 65 73  en though expres
23500 73 69 6f 6e 73 20 6d 61 79 20 61 70 70 65 61 72  sions may appear
23510 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 2c   to be constant,
23520 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20   they are not.  
23530 20 20 20 20 2a 2a 20 72 65 61 6c 6c 79 20 63 6f      ** really co
23540 6e 73 74 61 6e 74 20 62 65 63 61 75 73 65 20 74  nstant because t
23550 68 65 79 20 6f 72 69 67 69 6e 61 74 65 20 66 72  hey originate fr
23560 6f 6d 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  om the right-han
23570 64 20 73 69 64 65 0a 20 20 20 20 20 20 2a 2a 20  d side.      ** 
23580 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
23590 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  */.      pParse-
235a0 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d  >okConstFactor =
235b0 20 30 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20   0;.      inReg 
235c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
235d0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
235e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
235f0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 70 50 61  rget);.      pPa
23600 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
23610 6f 72 20 3d 20 6f 6b 43 6f 6e 73 74 46 61 63 74  or = okConstFact
23620 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
23630 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
23640 20 61 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20   addrINR);.     
23650 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
23660 67 65 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c  geP3(v, addrINR,
23670 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62   inReg);.      b
23680 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
23690 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
236a0 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
236b0 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
236c0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
236d0 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
236e0 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
236f0 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
23700 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
23710 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
23720 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
23730 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
23740 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
23750 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
23760 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
23770 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
23780 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
23790 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
237a0 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
237b0 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
237c0 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
237d0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
237e0 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
237f0 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
23800 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
23810 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
23820 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
23830 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
23840 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61  * Y is in the la
23850 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45  st element of pE
23860 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20  xpr->x.pList if 
23870 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
23880 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20  nExpr is.    ** 
23890 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61  odd.  The Y is a
238a0 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49  lso optional.  I
238b0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
238c0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c  elements in x.pL
238d0 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76  ist.    ** is ev
238e0 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d  en, then Y is om
238f0 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f  itted and the "o
23900 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74  therwise" result
23910 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
23920 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
23930 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
23940 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
23950 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
23960 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
23970 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
23980 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
23990 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
239a0 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
239b0 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
239c0 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
239d0 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
239e0 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
239f0 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
23a00 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
23a10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
23a20 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70  ault: assert( op
23a30 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20  ==TK_CASE ); {. 
23a40 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
23a50 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
23a60 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
23a70 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
23a80 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
23a90 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ab0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
23ac0 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
23ad0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
23ae0 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b00 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
23b10 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
23b20 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
23b50 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
23b60 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
23b70 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
23b80 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
23b90 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
23ba0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
23bb0 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
23bc0 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
23bd0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
23be0 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
23bf0 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
23c00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
23c10 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
23c20 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
23c30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23c50 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
23c60 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
23c70 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
23c80 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
23c90 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
23ca0 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
23cb0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  /.      Expr *pD
23cc0 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  el = 0;.      sq
23cd0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
23ce0 73 65 2d 3e 64 62 3b 0a 0a 20 20 20 20 20 20 61  se->db;..      a
23cf0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
23d00 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
23d10 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20  P_xIsSelect) && 
23d20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
23d30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
23d40 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
23d50 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
23d60 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
23d70 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
23d80 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
23d90 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
23da0 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
23db0 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
23dc0 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
23dd0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
23de0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  );.      if( (pX
23df0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29   = pExpr->pLeft)
23e00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
23e10 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Del = sqlite3Exp
23e20 72 44 75 70 28 64 62 2c 20 70 58 2c 20 30 29 3b  rDup(db, pX, 0);
23e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
23e40 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
23e50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23e60 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
23e70 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20   pDel);.        
23e80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
23e90 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
23ea0 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
23eb0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
23ec0 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
23ed0 28 70 44 65 6c 2c 20 65 78 70 72 43 6f 64 65 56  (pDel, exprCodeV
23ee0 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 44  ector(pParse, pD
23ef0 65 6c 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  el, &regFree1));
23f00 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
23f10 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
23f20 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
23f30 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c 20  (&opCompare, 0, 
23f40 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72 65  sizeof(opCompare
23f50 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  ));.        opCo
23f60 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51  mpare.op = TK_EQ
23f70 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
23f80 61 72 65 2e 70 4c 65 66 74 20 3d 20 70 44 65 6c  are.pLeft = pDel
23f90 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20  ;.        pTest 
23fa0 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20  = &opCompare;.  
23fb0 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
23fc0 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31 37  b351d95f9cd5ef17
23fd0 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38 36  e9d9dbae18f5ca86
23fe0 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20  11190001:.      
23ff0 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69    ** The value i
24000 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68 74  n regFree1 might
24010 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e   get SCopy-ed in
24020 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73 75  to the file resu
24030 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  lt..        ** S
24040 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
24050 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72 65   the regFree1 re
24060 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65  gister is not re
24070 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20  used for other. 
24080 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73         ** purpos
24090 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  es and possibly 
240a0 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
240b0 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65  .        regFree
240c0 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  1 = 0;.      }. 
240d0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
240e0 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b  nExpr-1; i=i+2){
240f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20  .        if( pX 
24100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
24110 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b  ert( pTest!=0 );
24120 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  .          opCom
24130 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c  pare.pRight = aL
24140 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
24150 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
24160 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74  .          pTest
24170 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e   = aListelem[i].
24180 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  pExpr;.        }
24190 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73  .        nextCas
241a0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
241b0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
241c0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
241d0 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54  se( pTest->op==T
241e0 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
241f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
24200 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
24210 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20  Test, nextCase, 
24220 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
24230 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  L);.        test
24240 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b  case( aListelem[
24250 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  i+1].pExpr->op==
24260 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
24270 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24280 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
24290 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
242a0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
242b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
242c0 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  oto(v, endLabel)
242d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
242e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
242f0 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
24300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24310 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29  ( (nExpr&1)!=0 )
24320 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24330 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
24340 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70  , pEList->a[nExp
24350 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  r-1].pExpr, targ
24360 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  et);.      }else
24370 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24380 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
24390 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
243a0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
243b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
243c0 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
243d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
243e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
243f0 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
24400 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
24410 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24420 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
24430 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
24440 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
24450 70 72 2d 3e 61 66 66 45 78 70 72 3d 3d 4f 45 5f  pr->affExpr==OE_
24460 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20  Rollback .      
24470 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
24480 66 66 45 78 70 72 3d 3d 4f 45 5f 41 62 6f 72 74  ffExpr==OE_Abort
24490 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
244a0 45 78 70 72 2d 3e 61 66 66 45 78 70 72 3d 3d 4f  Expr->affExpr==O
244b0 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20  E_Fail.         
244c0 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 45    || pExpr->affE
244d0 78 70 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20  xpr==OE_Ignore. 
244e0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
244f0 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67  ( !pParse->pTrig
24500 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20  gerTab ){.      
24510 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24520 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
24530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24540 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
24550 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
24560 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
24570 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ram");.        r
24580 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
24590 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
245a0 2d 3e 61 66 66 45 78 70 72 3d 3d 4f 45 5f 41 62  ->affExpr==OE_Ab
245b0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
245c0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
245d0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
245e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
245f0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
24600 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
24610 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e) );.      if( 
24620 70 45 78 70 72 2d 3e 61 66 66 45 78 70 72 3d 3d  pExpr->affExpr==
24630 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
24640 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24650 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
24660 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20      v, OP_Halt, 
24670 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67  SQLITE_OK, OE_Ig
24680 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e  nore, 0, pExpr->
24690 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20  u.zToken,0);.   
246a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
246b0 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
246c0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
246d0 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
246e0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
246f0 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
24700 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24720 20 20 70 45 78 70 72 2d 3e 61 66 66 45 78 70 72    pExpr->affExpr
24730 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
24740 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
24750 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
24760 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
24770 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
24780 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
24790 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
247a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
247b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
247c0 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
247d0 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
247e0 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63  Factor out the c
247f0 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ode of the given
24800 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69   expression to i
24810 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
24820 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  me..**.** If reg
24830 44 65 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65  Dest>=0 then the
24840 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79   result is alway
24850 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74  s stored in that
24860 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 74 68   register and th
24870 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e  e.** result is n
24880 6f 74 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66  ot reusable.  If
24890 20 72 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20   regDest<0 then 
248a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
248b0 66 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72  free to .** stor
248c0 65 20 74 68 65 20 76 61 6c 75 65 20 77 68 65 72  e the value wher
248d0 65 65 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20  eever it wants. 
248e0 20 54 68 65 20 72 65 67 69 73 74 65 72 20 77 68   The register wh
248f0 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ere the expressi
24900 6f 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  on .** is stored
24910 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57   is returned.  W
24920 68 65 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74  hen regDest<0, t
24930 77 6f 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70  wo identical exp
24940 72 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a  ressions will.**
24950 20 63 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d   code to the sam
24960 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  e register..*/.i
24970 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
24980 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73  deAtInit(.  Pars
24990 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
249a0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
249b0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
249c0 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  r,      /* The e
249d0 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64  xpression to cod
249e0 65 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20  e when the VDBE 
249f0 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20  initializes */. 
24a00 20 69 6e 74 20 72 65 67 44 65 73 74 20 20 20 20   int regDest    
24a10 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
24a20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
24a30 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
24a40 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73  xprList *p;.  as
24a50 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f  sert( ConstFacto
24a60 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20  rOk(pParse) );. 
24a70 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f   p = pParse->pCo
24a80 6e 73 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72  nstExpr;.  if( r
24a90 65 67 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b  egDest<0 && p ){
24aa0 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
24ab0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
24ac0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
24ad0 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c   for(pItem=p->a,
24ae0 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30   i=p->nExpr; i>0
24af0 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b  ; pItem++, i--){
24b00 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
24b10 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71  ->reusable && sq
24b20 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
24b30 28 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  (0,pItem->pExpr,
24b40 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a  pExpr,-1)==0 ){.
24b50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
24b60 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78  Item->u.iConstEx
24b70 70 72 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20  prReg;.      }. 
24b80 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72     }.  }.  pExpr
24b90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
24ba0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
24bb0 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73  xpr, 0);.  p = s
24bc0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
24bd0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20  pend(pParse, p, 
24be0 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20  pExpr);.  if( p 
24bf0 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20 45  ){.     struct E
24c00 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
24c10 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
24c20 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49  Expr-1];.     pI
24c30 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20  tem->reusable = 
24c40 72 65 67 44 65 73 74 3c 30 3b 0a 20 20 20 20 20  regDest<0;.     
24c50 69 66 28 20 72 65 67 44 65 73 74 3c 30 20 29 20  if( regDest<0 ) 
24c60 72 65 67 44 65 73 74 20 3d 20 2b 2b 70 50 61 72  regDest = ++pPar
24c70 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70  se->nMem;.     p
24c80 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78  Item->u.iConstEx
24c90 70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b  prReg = regDest;
24ca0 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70  .  }.  pParse->p
24cb0 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 20  ConstExpr = p;. 
24cc0 20 72 65 74 75 72 6e 20 72 65 67 44 65 73 74 3b   return regDest;
24cd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
24ce0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
24cf0 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
24d00 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  n and store the 
24d10 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
24d20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74  a register.  Ret
24d30 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
24d40 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68   number where th
24d50 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65  e results.** are
24d60 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   stored..**.** I
24d70 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  f the register i
24d80 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  s a temporary re
24d90 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20  gister that can 
24da0 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a  be deallocated,.
24db0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74  ** then write it
24dc0 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  s number into *p
24dd0 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73  Reg.  If the res
24de0 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
24df0 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  not.** a tempora
24e00 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ry, then set *pR
24e10 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  eg to zero..**.*
24e20 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
24e30 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
24e40 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
24e50 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a  t generate this.
24e60 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20  ** code to fill 
24e70 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20  the register in 
24e80 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
24e90 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  on section of th
24ea0 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61  e.** VDBE progra
24eb0 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  m, in order to f
24ec0 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20  actor it out of 
24ed0 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c  the evaluation l
24ee0 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oop..*/.int sqli
24ef0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
24f00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
24f10 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
24f20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32  *pReg){.  int r2
24f30 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
24f40 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
24f50 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70 45 78 70  teAndLikely(pExp
24f60 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46  r);.  if( ConstF
24f70 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a  actorOk(pParse).
24f80 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21     && pExpr->op!
24f90 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20  =TK_REGISTER.   
24fa0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
24fb0 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
24fc0 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20  pExpr).  ){.    
24fd0 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20  *pReg  = 0;.    
24fe0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
24ff0 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
25000 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20  e, pExpr, -1);. 
25010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
25020 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
25030 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
25040 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
25050 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
25060 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
25070 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72  );.    if( r2==r
25080 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67  1 ){.      *pReg
25090 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = r1;.    }else
250a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
250b0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
250c0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
250d0 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20   *pReg = 0;.    
250e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
250f0 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
25100 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
25110 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
25120 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
25130 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
25140 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
25150 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
25160 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
25170 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
25180 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
25190 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  target..*/.void 
251a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
251b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
251c0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
251d0 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
251e0 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
251f0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
25200 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
25210 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  m );.  if( pExpr
25220 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   && pExpr->op==T
25230 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
25240 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25250 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
25260 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70  e, OP_Copy, pExp
25270 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
25280 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
25290 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
252a0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
252b0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
252c0 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72  rget);.    asser
252d0 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
252e0 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
252f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
25300 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67  );.    if( inReg
25310 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72  !=target && pPar
25320 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
25330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25340 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
25350 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  be, OP_SCopy, in
25360 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
25370 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
25380 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e   Make a transien
25390 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  t copy of expres
253a0 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74  sion pExpr and t
253b0 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e  hen code it usin
253c0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72  g.** sqlite3Expr
253d0 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f  Code().  This ro
253e0 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74  utine works just
253f0 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
25400 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70  rCode().** excep
25410 74 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74  t that the input
25420 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67   expression is g
25430 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
25440 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
25450 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
25460 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50  deCopy(Parse *pP
25470 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
25480 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
25490 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
254a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45  pParse->db;.  pE
254b0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
254c0 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
254d0 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  0);.  if( !db->m
254e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71  allocFailed ) sq
254f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
25500 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
25510 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  get);.  sqlite3E
25520 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
25530 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  xpr);.}../*.** G
25540 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
25550 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
25560 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
25570 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
25580 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
25590 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
255a0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
255b0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
255c0 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
255d0 65 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74  er target.  If t
255e0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
255f0 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
25600 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
25610 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20  might choose to 
25620 63 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73  code the express
25630 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a  ion at initializ
25640 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76  ation time..*/.v
25650 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
25660 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61  odeFactorable(Pa
25670 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
25680 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
25690 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61  rget){.  if( pPa
256a0 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
256b0 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  or && sqlite3Exp
256c0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
256d0 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  in(pExpr) ){.   
256e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
256f0 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
25700 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
25710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
25720 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
25730 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
25740 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
25750 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
25760 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 68  hat evaluates th
25770 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
25780 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20  on and puts the 
25790 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67  result.** in reg
257a0 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a  ister target..**
257b0 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20  .** Also make a 
257c0 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
257d0 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  ession results i
257e0 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63  nto another "cac
257f0 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  he" register.** 
25800 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65  and modify the e
25810 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61  xpression so tha
25820 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  t the next time 
25830 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c  it is evaluated,
25840 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
25850 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
25860 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a  cache register..
25870 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
25880 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  ne is used for e
25890 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
258a0 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c  are used multipl
258b0 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68  e .** times.  Th
258c0 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ey are evaluated
258d0 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65   once and the re
258e0 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70  sults of the exp
258f0 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72  ression.** are r
25900 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  eused..*/.void s
25910 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e  qlite3ExprCodeAn
25920 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  dCache(Parse *pP
25930 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
25940 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
25950 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
25960 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
25970 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74   iMem;..  assert
25980 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
25990 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
259a0 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p!=TK_REGISTER )
259b0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
259c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
259d0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d  r, target);.  iM
259e0 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
259f0 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
25a00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
25a10 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65  opy, target, iMe
25a20 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69  m);.  exprToRegi
25a30 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d  ster(pExpr, iMem
25a40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
25a50 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
25a60 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
25a70 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
25a80 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
25a90 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
25aa0 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
25ab0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
25ac0 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
25ad0 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
25ae0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
25af0 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
25b00 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
25b10 74 75 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a 20 75  turned will.** u
25b20 73 75 61 6c 6c 79 20 62 65 20 70 4c 69 73 74 2d  sually be pList-
25b30 3e 6e 45 78 70 72 20 62 75 74 20 6d 69 67 68 74  >nExpr but might
25b40 20 62 65 20 72 65 64 75 63 65 64 20 69 66 20 53   be reduced if S
25b50 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52  QLITE_ECEL_OMITR
25b60 45 46 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  EF.** is defined
25b70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
25b80 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67  TE_ECEL_DUP flag
25b90 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61 72   prevents the ar
25ba0 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69  guments from bei
25bb0 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69  ng.** filled usi
25bc0 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50  ng OP_SCopy.  OP
25bd0 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73  _Copy must be us
25be0 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
25bf0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
25c00 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e  L_FACTOR argumen
25c10 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e  t allows constan
25c20 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62  t arguments to b
25c30 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75  e.** factored ou
25c40 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a  t into initializ
25c50 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ation code..**.*
25c60 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
25c70 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73  L_REF flag means
25c80 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
25c90 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69  s in the list wi
25ca0 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61  th.** ExprList.a
25cb0 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  [].u.x.iOrderByC
25cc0 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64  ol>0 have alread
25cd0 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64  y been evaluated
25ce0 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69   and stored.** i
25cf0 6e 20 72 65 67 69 73 74 65 72 73 20 61 74 20 73  n registers at s
25d00 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68  rcReg, and so th
25d10 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63  e value can be c
25d20 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65  opied from there
25d30 2e 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45  ..** If SQLITE_E
25d40 43 45 4c 5f 4f 4d 49 54 52 45 46 20 69 73 20 61  CEL_OMITREF is a
25d50 6c 73 6f 20 73 65 74 2c 20 74 68 65 6e 20 74 68  lso set, then th
25d60 65 20 76 61 6c 75 65 73 20 77 69 74 68 20 75 2e  e values with u.
25d70 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a  x.iOrderByCol>0.
25d80 2a 2a 20 61 72 65 20 73 69 6d 70 6c 79 20 6f 6d  ** are simply om
25d90 69 74 74 65 64 20 72 61 74 68 65 72 20 74 68 61  itted rather tha
25da0 6e 20 62 65 69 6e 67 20 63 6f 70 69 65 64 20 66  n being copied f
25db0 72 6f 6d 20 73 72 63 52 65 67 2e 0a 2a 2f 0a 69  rom srcReg..*/.i
25dc0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
25dd0 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  deExprList(.  Pa
25de0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
25df0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
25e00 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
25e10 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54  t *pList,   /* T
25e20 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
25e30 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  st to be coded *
25e40 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20  /.  int target, 
25e50 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
25e60 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
25e70 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67   */.  int srcReg
25e80 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72  ,        /* Sour
25e90 63 65 20 72 65 67 69 73 74 65 72 73 20 69 66 20  ce registers if 
25ea0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20  SQLITE_ECEL_REF 
25eb0 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20  */.  u8 flags   
25ec0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
25ed0 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a  E_ECEL_* flags *
25ee0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  /.){.  struct Ex
25ef0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
25f00 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  em;.  int i, j, 
25f10 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d  n;.  u8 copyOp =
25f20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25f30 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f  _ECEL_DUP) ? OP_
25f40 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b  Copy : OP_SCopy;
25f50 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
25f60 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
25f70 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
25f80 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ;.  assert( targ
25f90 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  et>0 );.  assert
25fa0 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
25fb0 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20  =0 );  /* Never 
25fc0 67 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74  gets this far ot
25fd0 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d  herwise */.  n =
25fe0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
25ff0 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f   if( !ConstFacto
26000 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c  rOk(pParse) ) fl
26010 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45  ags &= ~SQLITE_E
26020 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f  CEL_FACTOR;.  fo
26030 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
26040 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c  , i=0; i<n; i++,
26050 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45   pItem++){.    E
26060 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74  xpr *pExpr = pIt
26070 65 6d 2d 3e 70 45 78 70 72 3b 0a 23 69 66 64 65  em->pExpr;.#ifde
26080 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
26090 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
260a0 53 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  S.    if( pItem-
260b0 3e 62 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20  >bSorterRef ){. 
260c0 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20       i--;.      
260d0 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  n--;.    }else.#
260e0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 66  endif.    if( (f
260f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
26100 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a  EL_REF)!=0 && (j
26110 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
26120 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a  rderByCol)>0 ){.
26130 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
26140 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d  & SQLITE_ECEL_OM
26150 49 54 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20  ITREF ){.       
26160 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d   i--;.        n-
26170 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
26180 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
26190 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
261a0 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c  yOp, j+srcReg-1,
261b0 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
261c0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
261d0 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
261e0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d  E_ECEL_FACTOR)!=
261f0 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
26200 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
26210 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78  stantNotJoin(pEx
26220 70 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  pr).    ){.     
26230 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
26240 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
26250 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
26260 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26270 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71    int inReg = sq
26280 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
26290 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
262a0 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
262b0 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
262c0 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20  arget+i ){.     
262d0 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
262e0 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79          if( copy
262f0 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  Op==OP_Copy.    
26300 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c       && (pOp=sql
26310 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
26320 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f   -1))->opcode==O
26330 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20  P_Copy.         
26340 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  && pOp->p1+pOp->
26350 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20  p3+1==inReg.    
26360 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b       && pOp->p2+
26370 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65  pOp->p3+1==targe
26380 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  t+i.        ){. 
26390 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33           pOp->p3
263a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
263b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
263c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
263d0 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c  , copyOp, inReg,
263e0 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
263f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
26400 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
26410 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
26420 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
26430 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
26440 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45  r..**.**    x BE
26450 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a  TWEEN y AND z.**
26460 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
26470 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
26480 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e  **.**    x>=y AN
26490 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64  D x<=z.**.** Cod
264a0 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
264b0 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
264c0 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
264d0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d  pression.** elim
264e0 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a  ination of x..**
264f0 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20  .** The xJumpIf 
26500 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
26510 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a  ines details:.**
26520 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20  .**    NULL:    
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
26540 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e  tore the boolean
26550 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64   result in reg[d
26560 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74  est].**    sqlit
26570 65 33 45 78 70 72 49 66 54 72 75 65 3a 20 20 20  e3ExprIfTrue:   
26580 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20     Jump to dest 
26590 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71  if true.**    sq
265a0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
265b0 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65  :     Jump to de
265c0 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a  st if false.**.*
265d0 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  * The jumpIfNull
265e0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67   parameter is ig
265f0 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66  nored if xJumpIf
26600 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61   is NULL..*/.sta
26610 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64  tic void exprCod
26620 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73  eBetween(.  Pars
26630 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
26640 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
26650 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
26660 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
26670 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
26680 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65  he BETWEEN expre
26690 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
266a0 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
266b0 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  Jump destination
266c0 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61   or storage loca
266d0 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28  tion */.  void (
266e0 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45  *xJump)(Parse*,E
266f0 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f  xpr*,int,int), /
26700 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65  * Action to take
26710 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
26720 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20  Null    /* Take 
26730 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
26740 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20  BETWEEN is NULL 
26750 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70  */.){.  Expr exp
26760 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65  rAnd;     /* The
26770 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e   AND operator in
26780 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20    x>=y AND x<=z 
26790 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c   */.  Expr compL
267a0 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20  eft;    /* The  
267b0 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x>=y  term */.  
267c0 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20  Expr compRight; 
267d0 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20    /* The  x<=z  
267e0 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65  term */.  int re
267f0 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54  gFree1 = 0; /* T
26800 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
26810 69 73 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  ister */.  Expr 
26820 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  *pDel = 0;.  sql
26830 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
26840 65 2d 3e 64 62 3b 0a 0a 20 20 6d 65 6d 73 65 74  e->db;..  memset
26850 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73  (&compLeft, 0, s
26860 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
26870 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67 68  memset(&compRigh
26880 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  t, 0, sizeof(Exp
26890 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65  r));.  memset(&e
268a0 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f  xprAnd, 0, sizeo
268b0 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73 73  f(Expr));..  ass
268c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
268d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
268e0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
268f0 70 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  pDel = sqlite3Ex
26900 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d  prDup(db, pExpr-
26910 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 69 66  >pLeft, 0);.  if
26920 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
26930 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 70  ed==0 ){.    exp
26940 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
26950 3b 0a 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c  ;.    exprAnd.pL
26960 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b  eft = &compLeft;
26970 0a 20 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69  .    exprAnd.pRi
26980 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
26990 3b 0a 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f  ;.    compLeft.o
269a0 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 63  p = TK_GE;.    c
269b0 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
269c0 70 44 65 6c 3b 0a 20 20 20 20 63 6f 6d 70 4c 65  pDel;.    compLe
269d0 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
269e0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
269f0 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6d 70  .pExpr;.    comp
26a00 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45  Right.op = TK_LE
26a10 3b 0a 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e  ;.    compRight.
26a20 70 4c 65 66 74 20 3d 20 70 44 65 6c 3b 0a 20 20  pLeft = pDel;.  
26a30 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
26a40 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
26a50 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
26a60 0a 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73  .    exprToRegis
26a70 74 65 72 28 70 44 65 6c 2c 20 65 78 70 72 43 6f  ter(pDel, exprCo
26a80 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  deVector(pParse,
26a90 20 70 44 65 6c 2c 20 26 72 65 67 46 72 65 65 31   pDel, &regFree1
26aa0 29 29 3b 0a 20 20 20 20 69 66 28 20 78 4a 75 6d  ));.    if( xJum
26ab0 70 20 29 7b 0a 20 20 20 20 20 20 78 4a 75 6d 70  p ){.      xJump
26ac0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
26ad0 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
26ae0 75 6c 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ull);.    }else{
26af0 0a 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74  .      /* Mark t
26b00 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
26b10 20 62 65 69 6e 67 20 66 72 6f 6d 20 74 68 65 20   being from the 
26b20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
26b30 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20  se of a join.   
26b40 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68     ** so that th
26b50 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
26b60 65 54 61 72 67 65 74 28 29 20 72 6f 75 74 69 6e  eTarget() routin
26b70 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
26b80 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20 20  pt to move.     
26b90 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20   ** it into the 
26ba0 50 61 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72  Parse.pConstExpr
26bb0 20 6c 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c   list.  We shoul
26bc0 64 20 75 73 65 20 61 20 6e 65 77 20 62 69 74 20  d use a new bit 
26bd0 66 6f 72 20 74 68 69 73 2c 0a 20 20 20 20 20 20  for this,.      
26be0 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20  ** for clarity, 
26bf0 62 75 74 20 77 65 20 61 72 65 20 6f 75 74 20 6f  but we are out o
26c00 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 45 78  f bits in the Ex
26c10 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 73  pr.flags field s
26c20 6f 20 77 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  o we.      ** ha
26c30 76 65 20 74 6f 20 72 65 75 73 65 20 74 68 65 20  ve to reuse the 
26c40 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e  EP_FromJoin bit.
26c50 20 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20    Bummer. */.   
26c60 20 20 20 70 44 65 6c 2d 3e 66 6c 61 67 73 20 7c     pDel->flags |
26c70 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20  = EP_FromJoin;. 
26c80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26c90 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
26ca0 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
26cb0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
26cc0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
26cd0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
26ce0 72 65 65 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ree1);.  }.  sql
26cf0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
26d00 62 2c 20 70 44 65 6c 29 3b 0a 0a 20 20 2f 2a 20  b, pDel);..  /* 
26d10 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20  Ensure adequate 
26d20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f  test coverage */
26d30 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26d40 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26d50 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
26d60 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
26d70 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
26d80 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26d90 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
26da0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
26db0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
26dc0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
26dd0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
26de0 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
26df0 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
26e00 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
26e10 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26e20 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26e30 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21    && jumpIfNull!
26e40 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
26e50 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26e60 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26e70 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
26e80 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
26e90 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26ea0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26eb0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
26ec0 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
26ed0 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
26ee0 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
26ef0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
26f00 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
26f10 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
26f20 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26f30 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26f40 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26f50 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
26f60 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
26f70 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
26f80 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b  ase( xJump==0 );
26f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
26fa0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
26fb0 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
26fc0 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
26fd0 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
26fe0 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
26ff0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
27000 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
27010 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
27020 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
27030 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
27040 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
27050 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
27060 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
27070 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
27080 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
27090 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
270a0 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
270b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
270c0 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
270d0 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FNULL..**.** Thi
270e0 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
270f0 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
27100 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
27110 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
27120 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
27130 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
27140 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
27150 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
27160 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
27170 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
27180 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
27190 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
271a0 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
271b0 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
271c0 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
271d0 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
271e0 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
271f0 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
27200 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
27210 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
27220 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
27230 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
27240 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
27250 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
27260 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
27270 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
27280 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
27290 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
272a0 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
272b0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
272c0 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
272d0 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
272e0 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
272f0 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
27300 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
27310 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
27320 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
27330 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65  R(v==0) )     re
27340 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65  turn;  /* Existe
27350 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
27360 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
27370 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
27380 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  pr==0) ) return;
27390 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73    /* No way this
273a0 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20   can happen */. 
273b0 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
273c0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
273d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
273e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
273f0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
27400 70 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pAlt = sqlite3Ex
27410 70 72 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f  prSimplifiedAndO
27420 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  r(pExpr);.      
27430 69 66 28 20 70 41 6c 74 21 3d 70 45 78 70 72 20  if( pAlt!=pExpr 
27440 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27450 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
27460 72 73 65 2c 20 70 41 6c 74 2c 20 64 65 73 74 2c  rse, pAlt, dest,
27470 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
27480 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
27490 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
274a0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
274b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
274c0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
274d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
274e0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
274f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27500 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
27510 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
27520 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
27530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 75                ju
27540 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
27550 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
27560 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27570 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
27580 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
27590 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
275a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
275b0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
275c0 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 7d  (v, d2);.      }
275d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
275e0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
275f0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ll==0 );.       
27600 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
27610 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
27620 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
27630 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
27640 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
27650 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
27660 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
27670 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
27680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
27690 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
276a0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
276b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
276c0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
276d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
276e0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
276f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
27700 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
27710 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27720 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27730 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69  TRUTH: {.      i
27740 6e 74 20 69 73 4e 6f 74 3b 20 20 20 20 20 20 2f  nt isNot;      /
27750 2a 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72  * IS NOT TRUE or
27760 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f   IS NOT FALSE */
27770 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75  .      int isTru
27780 65 3b 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55  e;     /* IS TRU
27790 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45  E or IS NOT TRUE
277a0 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
277b0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
277c0 30 20 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74  0 );.      isNot
277d0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54   = pExpr->op2==T
277e0 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69  K_ISNOT;.      i
277f0 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45  sTrue = sqlite3E
27800 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45  xprTruthValue(pE
27810 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
27820 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
27830 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b  True && isNot );
27840 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27850 20 21 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f   !isTrue && isNo
27860 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  t );.      if( i
27870 73 54 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b  sTrue ^ isNot ){
27880 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27890 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
278a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
278b0 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20   dest,.         
278c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278d0 20 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f   isNot ? SQLITE_
278e0 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b  JUMPIFNULL : 0);
278f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27900 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27910 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
27920 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
27930 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27950 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a  isNot ? SQLITE_J
27960 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a  UMPIFNULL : 0);.
27970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
27980 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
27990 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
279a0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
279b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
279c0 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
279d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
279e0 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
279f0 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
27a00 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
27a10 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  E;.      jumpIfN
27a20 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
27a30 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
27a40 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
27a50 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
27a60 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
27a70 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
27a80 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
27a90 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
27aa0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
27ab0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
27ac0 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
27ad0 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
27ae0 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
27af0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
27b00 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
27b10 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
27b20 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
27b30 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27b40 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
27b50 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
27b60 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
27b70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
27b80 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
27b90 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
27ba0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
27bb0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
27bc0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
27be0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
27bf0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27c00 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
27c10 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
27c20 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
27c30 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
27c40 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
27c50 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
27c60 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
27c70 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
27c80 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
27c90 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
27ca0 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
27cb0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
27cc0 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
27cd0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
27ce0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
27cf0 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
27d00 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
27d10 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
27d20 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
27d30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
27d40 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
27d50 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
27d60 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27d70 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
27d80 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
27d90 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
27da0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
27db0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
27dc0 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
27dd0 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
27de0 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
27df0 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
27e00 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
27e10 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
27e20 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
27e30 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
27e40 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
27e50 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
27e60 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27e70 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
27e80 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
27e90 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
27ea0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
27eb0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
27ec0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
27ed0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
27ee0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
27ef0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
27f00 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
27f10 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
27f20 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
27f30 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74  IsNull );   test
27f40 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
27f50 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ULL );.      ass
27f60 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
27f70 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74  =OP_NotNull ); t
27f80 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
27f90 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
27fa0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
27fb0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
27fc0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
27fd0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
27fe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27ff0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
28000 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  est);.      Vdbe
28010 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
28020 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20  ==TK_ISNULL);.  
28030 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
28040 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
28050 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
28060 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
28070 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
28080 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
28090 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
280a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
280b0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
280c0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
280d0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
280e0 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
280f0 74 65 33 45 78 70 72 49 66 54 72 75 65 2c 20 6a  te3ExprIfTrue, j
28100 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
28110 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
28120 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28130 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
28140 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
28150 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
28160 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
28170 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
28180 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  e);.      int de
28190 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49  stIfNull = jumpI
281a0 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64  fNull ? dest : d
281b0 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20  estIfFalse;.    
281c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
281d0 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
281e0 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  r, destIfFalse, 
281f0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
28200 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
28210 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
28220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
28230 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
28240 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
28250 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
28260 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
28270 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74  t: {.    default
28280 5f 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28  _expr:.      if(
28290 20 45 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   ExprAlwaysTrue(
282a0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
282b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
282c0 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
282d0 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
282e0 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70  AlwaysFalse(pExp
282f0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
28300 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   No-op */.      
28310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
28320 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
28330 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
28340 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
28350 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28360 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
28370 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c  OP_If, r1, dest,
28380 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
28390 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
283a0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
283b0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
283c0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
283d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
283e0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
283f0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
28400 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
28410 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
28420 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
28430 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
28440 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
28450 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
28460 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
28470 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
28480 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
28490 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
284a0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
284b0 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
284c0 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
284d0 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
284e0 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
284f0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
28500 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
28510 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
28520 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
28530 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
28540 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
28550 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
28560 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
28570 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
28580 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
28590 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
285a0 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
285b0 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
285c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
285d0 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
285e0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
285f0 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
28600 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
28610 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
28620 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
28630 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
28640 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
28650 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
28660 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
28670 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
28680 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
28690 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
286a0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
286b0 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
286c0 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74  return; /* Exist
286d0 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
286e0 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
286f0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
28700 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20   )    return;.. 
28710 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
28720 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
28730 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
28740 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
28750 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
28760 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
28770 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
28780 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
28790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
287a0 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
287b0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
287c0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
287d0 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
287e0 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
287f0 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
28800 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
28810 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
28830 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
28840 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
28850 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
28860 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
28870 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
28880 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
28890 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
288a0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
288c0 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
288d0 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
288e0 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
288f0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
28900 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
28910 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
28920 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
28930 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
28940 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
28950 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
28960 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
28970 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
28980 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
28990 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
289a0 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
289b0 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
289c0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
289d0 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
289e0 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
289f0 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
28a00 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
28a10 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
28a20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
28a30 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
28a40 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
28a50 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
28a60 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
28a70 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28a80 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
28a90 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
28aa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
28ab0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
28ac0 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
28ad0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28ae0 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
28af0 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
28b00 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
28b10 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
28b20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
28b30 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
28b40 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
28b50 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28b60 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
28b70 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
28b80 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28b90 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
28ba0 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
28bb0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
28bc0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
28bd0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
28be0 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 6c 74        Expr *pAlt
28bf0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 69   = sqlite3ExprSi
28c00 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72 28 70 45  mplifiedAndOr(pE
28c10 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
28c20 70 41 6c 74 21 3d 70 45 78 70 72 20 29 7b 0a 20  pAlt!=pExpr ){. 
28c30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
28c40 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
28c50 2c 20 70 41 6c 74 2c 20 64 65 73 74 2c 20 6a 75  , pAlt, dest, ju
28c60 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
28c70 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
28c80 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
28c90 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
28ca0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
28cb0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28cc0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
28cd0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
28ce0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
28cf0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
28d00 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
28d10 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28d20 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
28d30 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
28d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28d50 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
28d60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
28d70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
28d80 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28d90 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
28da0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
28db0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
28dc0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 0a 20  pr->pLeft, d2,. 
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28de0 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 66 4e           jumpIfN
28df0 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
28e00 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
28e10 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
28e20 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
28e30 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
28e40 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
28e50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28e60 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
28e70 64 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d2);.      }.   
28e80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28e90 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
28ea0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
28eb0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
28ec0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
28ed0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
28ee0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
28ef0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
28f00 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
28f10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
28f20 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20   TK_TRUTH: {.   
28f30 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20     int isNot;   
28f40 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f  /* IS NOT TRUE o
28f50 72 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a  r IS NOT FALSE *
28f60 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72  /.      int isTr
28f70 75 65 3b 20 20 2f 2a 20 49 53 20 54 52 55 45 20  ue;  /* IS TRUE 
28f80 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  or IS NOT TRUE *
28f90 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
28fa0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
28fb0 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d  );.      isNot =
28fc0 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f   pExpr->op2==TK_
28fd0 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73 54  ISNOT;.      isT
28fe0 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rue = sqlite3Exp
28ff0 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
29000 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
29010 20 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72    testcase( isTr
29020 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20  ue && isNot );. 
29030 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21       testcase( !
29040 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20  isTrue && isNot 
29050 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  );.      if( isT
29060 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20  rue ^ isNot ){. 
29070 20 20 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55         /* IS TRU
29080 45 20 61 6e 64 20 49 53 20 4e 4f 54 20 46 41 4c  E and IS NOT FAL
29090 53 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  SE */.        sq
290a0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
290b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
290c0 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20  pLeft, dest,.   
290d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290e0 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
290f0 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  0 : SQLITE_JUMPI
29100 46 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 7d  FNULL);..      }
29110 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
29120 20 49 53 20 46 41 4c 53 45 20 61 6e 64 20 49 53   IS FALSE and IS
29130 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
29140 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
29150 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
29160 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
29170 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e               isN
29190 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f  ot ? 0 : SQLITE_
291a0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
291b0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
291c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
291d0 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
291e0 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20   TK_ISNOT:.     
291f0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
29200 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
29210 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
29220 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
29230 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  OT );.      op =
29240 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   (pExpr->op==TK_
29250 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b  IS) ? TK_NE : TK
29260 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49  _EQ;.      jumpI
29270 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e  fNull = SQLITE_N
29280 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20  ULLEQ;.      /* 
29290 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  Fall thru */.   
292a0 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
292b0 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
292c0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
292d0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
292e0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
292f0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
29300 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29310 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78  ExprIsVector(pEx
29320 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74  pr->pLeft) ) got
29330 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a  o default_expr;.
29340 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29350 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
29360 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
29370 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
29380 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
29390 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
293a0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
293b0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
293c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
293d0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
293e0 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
293f0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
29400 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
29410 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
29420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29430 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
29440 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
29450 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
29460 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
29470 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
29480 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
29490 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
294a0 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
294b0 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
294c0 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
294d0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
294e0 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Le);.      as
294f0 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
29500 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
29510 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
29520 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
29530 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Gt);.      asse
29540 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
29550 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
29560 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
29570 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
29580 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
29590 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
295a0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
295b0 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Eq);.      VdbeC
295c0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
295d0 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
295e0 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
295f0 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
29600 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
29610 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
29620 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
29630 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73  LLEQ);.      ass
29640 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
29650 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
29660 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64  OP_Ne);.      Vd
29670 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
29680 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
29690 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
296a0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
296b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
296c0 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
296d0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
296e0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
296f0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
29700 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
29710 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
29720 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
29730 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
29740 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
29750 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
29760 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  LL: {.      r1 =
29770 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
29780 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
29790 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
297a0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
297b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
297c0 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
297d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
297e0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
297f0 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;   VdbeCoverage
29800 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
29810 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
29820 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
29830 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76  NULL );  VdbeCov
29840 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
29850 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
29860 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
29870 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
29880 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
29890 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
298a0 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
298b0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
298c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
298d0 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
298e0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
298f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
29900 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  lse, jumpIfNull)
29910 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
29920 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
29930 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
29940 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
29950 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75  : {.      if( ju
29960 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  mpIfNull ){.    
29970 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
29980 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
29990 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29  xpr, dest, dest)
299a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
299b0 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49         int destI
299c0 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
299d0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
299e0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
299f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
29a00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
29a10 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  est, destIfNull)
29a20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
29a30 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
29a40 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
29a50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29a60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
29a70 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
29a80 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65   {.    default_e
29a90 78 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20  xpr: .      if( 
29aa0 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  ExprAlwaysFalse(
29ab0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
29ac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
29ad0 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
29ae0 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
29af0 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
29b00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
29b10 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  no-op */.      }
29b20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
29b30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
29b40 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
29b50 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
29b60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
29b70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
29b80 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73  P_IfNot, r1, des
29b90 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
29ba0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
29bb0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
29bc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
29bd0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
29be0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
29bf0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
29c00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
29c10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
29c20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
29c30 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
29c40 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
29c50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
29c60 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
29c70 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  e2);.}../*.** Li
29c80 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  ke sqlite3ExprIf
29c90 46 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74  False() except t
29ca0 68 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61  hat a copy is ma
29cb0 64 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f  de of pExpr befo
29cc0 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72  re.** code gener
29cd0 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20  ation, and that 
29ce0 63 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20  copy is deleted 
29cf0 61 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72  after code gener
29d00 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65  ation. This.** e
29d10 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
29d20 6f 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69  original pExpr i
29d30 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  s unchanged..*/.
29d40 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
29d50 49 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65  IfFalseDup(Parse
29d60 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
29d70 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
29d80 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
29d90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
29da0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
29db0 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c  xpr *pCopy = sql
29dc0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
29dd0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28  pExpr, 0);.  if(
29de0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
29df0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
29e00 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
29e10 50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65  Parse, pCopy, de
29e20 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
29e30 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
29e40 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
29e50 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  py);.}../*.** Ex
29e60 70 72 65 73 73 69 6f 6e 20 70 56 61 72 20 69 73  pression pVar is
29e70 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
29e80 65 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c  e an SQL variabl
29e90 65 2e 20 70 45 78 70 72 20 6d 61 79 20 62 65 20  e. pExpr may be 
29ea0 61 6e 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65  any.** type of e
29eb0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
29ec0 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73   If pExpr is a s
29ed0 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20  imple SQL value 
29ee0 2d 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65  - an integer, re
29ef0 61 6c 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62  al, string, blob
29f00 0a 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75  .** or NULL valu
29f10 65 20 2d 20 74 68 65 6e 20 74 68 65 20 56 44 42  e - then the VDB
29f20 45 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  E currently bein
29f30 67 20 70 72 65 70 61 72 65 64 20 69 73 20 63 6f  g prepared is co
29f40 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72  nfigured.** to r
29f50 65 2d 70 72 65 70 61 72 65 20 65 61 63 68 20 74  e-prepare each t
29f60 69 6d 65 20 61 20 6e 65 77 20 76 61 6c 75 65 20  ime a new value 
29f70 69 73 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69  is bound to vari
29f80 61 62 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a  able pVar..**.**
29f90 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
29fa0 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d  f pExpr is a sim
29fb0 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 61 6e  ple SQL value an
29fc0 64 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 74  d the value is t
29fd0 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68  he.** same as th
29fe0 61 74 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75  at currently bou
29ff0 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70  nd to variable p
2a000 56 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  Var, non-zero is
2a010 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74   returned..** Ot
2a020 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
2a030 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 74  values are not t
2a040 68 65 20 73 61 6d 65 20 6f 72 20 69 66 20 70 45  he same or if pE
2a050 78 70 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d  xpr is not a sim
2a060 70 6c 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65  ple.** SQL value
2a070 2c 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  , zero is return
2a080 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2a090 74 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72  t exprCompareVar
2a0a0 69 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  iable(Parse *pPa
2a0b0 72 73 65 2c 20 45 78 70 72 20 2a 70 56 61 72 2c  rse, Expr *pVar,
2a0c0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2a0d0 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
2a0e0 69 6e 74 20 69 56 61 72 3b 0a 20 20 73 71 6c 69  int iVar;.  sqli
2a0f0 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a  te3_value *pL, *
2a100 70 52 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c  pR = 0;.  .  sql
2a110 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70  ite3ValueFromExp
2a120 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  r(pParse->db, pE
2a130 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  xpr, SQLITE_UTF8
2a140 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  , SQLITE_AFF_BLO
2a150 42 2c 20 26 70 52 29 3b 0a 20 20 69 66 28 20 70  B, &pR);.  if( p
2a160 52 20 29 7b 0a 20 20 20 20 69 56 61 72 20 3d 20  R ){.    iVar = 
2a170 70 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pVar->iColumn;. 
2a180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
2a190 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
2a1a0 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20  >pVdbe, iVar);. 
2a1b0 20 20 20 70 4c 20 3d 20 73 71 6c 69 74 65 33 56     pL = sqlite3V
2a1c0 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
2a1d0 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70  (pParse->pReprep
2a1e0 61 72 65 2c 20 69 56 61 72 2c 20 53 51 4c 49 54  are, iVar, SQLIT
2a1f0 45 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20  E_AFF_BLOB);.   
2a200 20 69 66 28 20 70 4c 20 29 7b 0a 20 20 20 20 20   if( pL ){.     
2a210 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
2a220 75 65 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c  ue_type(pL)==SQL
2a230 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
2a240 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
2a250 65 5f 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d  e_text(pL); /* M
2a260 61 6b 65 20 73 75 72 65 20 74 68 65 20 65 6e 63  ake sure the enc
2a270 6f 64 69 6e 67 20 69 73 20 55 54 46 2d 38 20 2a  oding is UTF-8 *
2a280 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
2a290 72 65 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65  res =  0==sqlite
2a2a0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20  3MemCompare(pL, 
2a2b0 70 52 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  pR, 0);.    }.  
2a2c0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
2a2d0 65 65 28 70 52 29 3b 0a 20 20 20 20 73 71 6c 69  ee(pR);.    sqli
2a2e0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 29  te3ValueFree(pL)
2a2f0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2a300 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  res;.}../*.** Do
2a310 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
2a320 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
2a330 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
2a340 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
2a350 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
2a360 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  are completely i
2a370 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72  dentical.  Retur
2a380 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66  n 1 if they diff
2a390 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20  er only.** by a 
2a3a0 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
2a3b0 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65   at the top leve
2a3c0 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20  l.  Return 2 if 
2a3d0 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
2a3e0 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74  ences.** other t
2a3f0 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  han the top-leve
2a400 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  l COLLATE operat
2a410 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  or..**.** If any
2a420 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
2a430 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
2a440 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
2a450 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
2a460 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
2a470 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
2a480 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
2a490 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
2a4a0 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iTab..**.** The 
2a4b0 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65  pA side might be
2a4c0 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
2a4d0 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  ER.  If that is 
2a4e0 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20  the case and pB 
2a4f0 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20  is.** not using 
2a500 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20  TK_REGISTER but 
2a510 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75  is otherwise equ
2a520 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74  ivalent, then st
2a530 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ill return 0..**
2a540 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  .** Sometimes th
2a550 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2a560 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66  return 2 even if
2a570 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
2a580 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
2a590 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
2a5a0 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
2a5b0 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
2a5c0 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
2a5d0 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
2a5e0 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65  urn 2 just to be
2a5f0 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
2a600 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
2a610 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f  turns 2, then yo
2a620 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
2a630 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
2a640 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
2a650 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
2a660 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
2a670 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20   you get a 0 or 
2a680 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  1 return, then y
2a690 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
2a6a0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
2a6b0 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
2a6c0 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
2a6d0 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
2a6e0 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
2a6f0 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
2a700 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32  o get an extra 2
2a710 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20   - that.** just 
2a720 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
2a730 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c  some slightly sl
2a740 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20  ower code.  But 
2a750 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20  returning.** an 
2a760 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31  incorrect 0 or 1
2a770 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
2a780 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   malfunction..**
2a790 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73  .** If pParse is
2a7a0 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54   not NULL then T
2a7b0 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d 73  K_VARIABLE terms
2a7c0 20 69 6e 20 70 41 20 77 69 74 68 20 62 69 6e 64   in pA with bind
2a7d0 69 6e 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73  ings in.** pPars
2a7e0 65 2d 3e 70 52 65 70 72 65 70 61 72 65 20 63 61  e->pReprepare ca
2a7f0 6e 20 62 65 20 6d 61 74 63 68 65 64 20 61 67 61  n be matched aga
2a800 69 6e 73 74 20 6c 69 74 65 72 61 6c 73 20 69 6e  inst literals in
2a810 20 70 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50   pB.  The .** pP
2a820 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70  arse->pVdbe->exp
2a830 6d 61 73 6b 20 62 69 74 6d 61 73 6b 20 69 73 20  mask bitmask is 
2a840 75 70 64 61 74 65 64 20 66 6f 72 20 65 61 63 68  updated for each
2a850 20 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65   variable refere
2a860 6e 63 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72  nced..** If pPar
2a870 73 65 20 69 73 20 4e 55 4c 4c 20 28 74 68 65 20  se is NULL (the 
2a880 6e 6f 72 6d 61 6c 20 63 61 73 65 29 20 74 68 65  normal case) the
2a890 6e 20 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c  n any TK_VARIABL
2a8a0 45 20 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72  E term in .** Ar
2a8b0 67 75 6d 65 6e 74 20 70 50 61 72 73 65 20 73 68  gument pParse sh
2a8c0 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
2a8d0 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20   NULL. If it is 
2a8e0 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20  not NULL and pA 
2a8f0 6f 72 0a 2a 2a 20 70 42 20 63 61 75 73 65 73 20  or.** pB causes 
2a900 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  a return value o
2a910 66 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  f 2..*/.int sqli
2a920 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 50  te3ExprCompare(P
2a930 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
2a940 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
2a950 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75  , int iTab){.  u
2a960 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  32 combinedFlags
2a970 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c  ;.  if( pA==0 ||
2a980 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   pB==0 ){.    re
2a990 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20  turn pB==pA ? 0 
2a9a0 3a 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  : 2;.  }.  if( p
2a9b0 50 61 72 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d  Parse && pA->op=
2a9c0 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20  =TK_VARIABLE && 
2a9d0 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61  exprCompareVaria
2a9e0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 41 2c 20  ble(pParse, pA, 
2a9f0 70 42 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  pB) ){.    retur
2aa00 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69  n 0;.  }.  combi
2aa10 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66  nedFlags = pA->f
2aa20 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73  lags | pB->flags
2aa30 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  ;.  if( combined
2aa40 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  Flags & EP_IntVa
2aa50 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28  lue ){.    if( (
2aa60 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c  pA->flags&pB->fl
2aa70 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29  ags&EP_IntValue)
2aa80 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61  !=0 && pA->u.iVa
2aa90 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75  lue==pB->u.iValu
2aaa0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
2aab0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 0;.    }.    r
2aac0 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
2aad0 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f  f( pA->op!=pB->o
2aae0 70 20 7c 7c 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f  p || pA->op==TK_
2aaf0 52 41 49 53 45 20 29 7b 0a 20 20 20 20 69 66 28  RAISE ){.    if(
2ab00 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
2ab10 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
2ab20 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
2ab30 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42 2c 69  , pA->pLeft,pB,i
2ab40 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
2ab50 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2ab60 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d      if( pB->op==
2ab70 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
2ab80 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2ab90 28 70 50 61 72 73 65 2c 20 70 41 2c 70 42 2d 3e  (pParse, pA,pB->
2aba0 70 4c 65 66 74 2c 69 54 61 62 29 3c 32 20 29 7b  pLeft,iTab)<2 ){
2abb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2abc0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2abd0 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 2;.  }.  if( p
2abe0 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  A->op!=TK_COLUMN
2abf0 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41   && pA->op!=TK_A
2ac00 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  GG_COLUMN && pA-
2ac10 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
2ac20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
2ac30 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70 41 2d 3e  FUNCTION || pA->
2ac40 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
2ac50 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ION ){.      if(
2ac60 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2ac70 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
2ac80 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20  >u.zToken)!=0 ) 
2ac90 72 65 74 75 72 6e 20 32 3b 0a 23 69 66 6e 64 65  return 2;.#ifnde
2aca0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
2acb0 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 61  NDOWFUNC.      a
2acc0 73 73 65 72 74 28 20 70 41 2d 3e 6f 70 3d 3d 70  ssert( pA->op==p
2acd0 42 2d 3e 6f 70 20 29 3b 0a 20 20 20 20 20 20 69  B->op );.      i
2ace0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
2acf0 74 79 28 70 41 2c 45 50 5f 57 69 6e 46 75 6e 63  ty(pA,EP_WinFunc
2ad00 29 21 3d 45 78 70 72 48 61 73 50 72 6f 70 65 72  )!=ExprHasProper
2ad10 74 79 28 70 42 2c 45 50 5f 57 69 6e 46 75 6e 63  ty(pB,EP_WinFunc
2ad20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
2ad30 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 2;.      }. 
2ad40 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
2ad50 50 72 6f 70 65 72 74 79 28 70 41 2c 45 50 5f 57  Property(pA,EP_W
2ad60 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  inFunc) ){.     
2ad70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 69     if( sqlite3Wi
2ad80 6e 64 6f 77 43 6f 6d 70 61 72 65 28 70 50 61 72  ndowCompare(pPar
2ad90 73 65 2c 20 70 41 2d 3e 79 2e 70 57 69 6e 2c 20  se, pA->y.pWin, 
2ada0 70 42 2d 3e 79 2e 70 57 69 6e 2c 20 31 29 21 3d  pB->y.pWin, 1)!=
2adb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
2adc0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 20  eturn 2;.       
2add0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
2ade0 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
2adf0 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20  pA->op==TK_NULL 
2ae00 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2ae10 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
2ae20 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
2ae30 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ATE ){.      if(
2ae40 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
2ae50 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42  (pA->u.zToken,pB
2ae60 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29  ->u.zToken)!=0 )
2ae70 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
2ae80 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
2ae90 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 29  pB->u.zToken!=0)
2aea0 20 26 26 20 73 74 72 63 6d 70 28 70 41 2d 3e 75   && strcmp(pA->u
2aeb0 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
2aec0 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  oken)!=0 ){.    
2aed0 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
2aee0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d  }.  }.  if( (pA-
2aef0 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
2af00 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67  inct)!=(pB->flag
2af10 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
2af20 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
2af30 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  f( (combinedFlag
2af40 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  s & EP_TokenOnly
2af50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2af60 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
2af70 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72  EP_xIsSelect ) r
2af80 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
2af90 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20   (combinedFlags 
2afa0 26 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 3d 3d  & EP_FixedCol)==
2afb0 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  0.     && sqlite
2afc0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
2afd0 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 20  rse, pA->pLeft, 
2afe0 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  pB->pLeft, iTab)
2aff0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
2b000 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2b010 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
2b020 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
2b030 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 20  pRight, iTab) ) 
2b040 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
2b050 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
2b060 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70  tCompare(pA->x.p
2b070 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73  List, pB->x.pLis
2b080 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
2b090 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  n 2;.    if( pA-
2b0a0 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 0a 20  >op!=TK_STRING. 
2b0b0 20 20 20 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54      && pA->op!=T
2b0c0 4b 5f 54 52 55 45 46 41 4c 53 45 0a 20 20 20 20  K_TRUEFALSE.    
2b0d0 20 26 26 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61   && (combinedFla
2b0e0 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64 29  gs & EP_Reduced)
2b0f0 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
2b100 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e   if( pA->iColumn
2b110 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
2b120 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20  return 2;.      
2b130 69 66 28 20 70 41 2d 3e 6f 70 32 21 3d 70 42 2d  if( pA->op2!=pB-
2b140 3e 6f 70 32 20 29 20 72 65 74 75 72 6e 20 32 3b  >op2 ) return 2;
2b150 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  .      if( pA->o
2b160 70 21 3d 54 4b 5f 49 4e 0a 20 20 20 20 20 20 20  p!=TK_IN.       
2b170 26 26 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70  && pA->iTable!=p
2b180 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20  B->iTable .     
2b190 20 20 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65    && (pA->iTable
2b1a0 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28  !=iTab || NEVER(
2b1b0 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20  pB->iTable>=0)) 
2b1c0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2b1d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2b1e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
2b1f0 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  re two ExprList 
2b200 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e  objects.  Return
2b210 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20 69   0 if they are i
2b220 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a  dentical and .**
2b230 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
2b240 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20  y differ in any 
2b250 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  way..**.** If an
2b260 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20  y subelement of 
2b270 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62  pB has Expr.iTab
2b280 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74  le==(-1) then it
2b290 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
2b2a0 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  o compare equal 
2b2b0 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  to an equivalent
2b2c0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77   element in pA w
2b2d0 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  ith Expr.iTable=
2b2e0 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  =iTab..**.** Thi
2b2f0 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2b300 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
2b310 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45  for equivalent E
2b320 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a  xprLists.  The.*
2b330 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e  * only consequen
2b340 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62  ce will be disab
2b350 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  led optimization
2b360 73 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  s.  But this rou
2b370 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76  tine.** must nev
2b380 65 72 20 72 65 74 75 72 6e 20 30 20 69 66 20 74  er return 0 if t
2b390 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  he two ExprList 
2b3a0 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69 66 66  objects are diff
2b3b0 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d  erent, or.** a m
2b3c0 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  alfunction will 
2b3d0 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77  result..**.** Tw
2b3e0 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20  o NULL pointers 
2b3f0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
2b400 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20  o be the same.  
2b410 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  But a NULL point
2b420 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66  er.** always dif
2b430 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  fers from a non-
2b440 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
2b450 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2b460 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72  ListCompare(Expr
2b470 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69  List *pA, ExprLi
2b480 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  st *pB, int iTab
2b490 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
2b4a0 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30  ( pA==0 && pB==0
2b4b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
2b4c0 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
2b4d0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
2b4e0 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70  if( pA->nExpr!=p
2b4f0 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72  B->nExpr ) retur
2b500 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 1;.  for(i=0; 
2b510 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  i<pA->nExpr; i++
2b520 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
2b530 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70  prA = pA->a[i].p
2b540 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
2b550 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69  pExprB = pB->a[i
2b560 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
2b570 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 46 6c   pA->a[i].sortFl
2b580 61 67 73 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f  ags!=pB->a[i].so
2b590 72 74 46 6c 61 67 73 20 29 20 72 65 74 75 72 6e  rtFlags ) return
2b5a0 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
2b5b0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
2b5c0 2c 20 70 45 78 70 72 41 2c 20 70 45 78 70 72 42  , pExprA, pExprB
2b5d0 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
2b5e0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2b5f0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b   0;.}../*.** Lik
2b600 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  e sqlite3ExprCom
2b610 70 61 72 65 28 29 20 65 78 63 65 70 74 20 43 4f  pare() except CO
2b620 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20  LLATE operators 
2b630 61 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  at the top-level
2b640 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  .** are ignored.
2b650 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2b660 78 70 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 45  xprCompareSkip(E
2b670 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70  xpr *pA, Expr *p
2b680 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
2b690 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
2b6a0 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a 20 20 20  prCompare(0,.   
2b6b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b6c0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
2b6d0 41 6e 64 4c 69 6b 65 6c 79 28 70 41 29 2c 0a 20  AndLikely(pA),. 
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2b6f0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2b700 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70 42 29 2c  teAndLikely(pB),
2b710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54  .             iT
2b720 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ab);.}../*.** Re
2b730 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
2b740 20 45 78 70 72 20 70 20 63 61 6e 20 6f 6e 6c 79   Expr p can only
2b750 20 62 65 20 74 72 75 65 20 69 66 20 70 4e 4e 20   be true if pNN 
2b760 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 2a 2a 0a  is not NULL..**.
2b770 2a 2a 20 4f 72 20 69 66 20 73 65 65 6e 4e 6f 74  ** Or if seenNot
2b780 20 69 73 20 74 72 75 65 2c 20 72 65 74 75 72 6e   is true, return
2b790 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 45 78 70   non-zero if Exp
2b7a0 72 20 70 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a  r p can only be.
2b7b0 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 70  ** non-NULL if p
2b7c0 4e 4e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 0a 2a  NN is not NULL.*
2b7d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
2b7e0 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2b7f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2b800 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
2b810 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
2b820 78 70 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20  xpr *p,         
2b830 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
2b840 73 69 6f 6e 20 74 6f 20 62 65 20 63 68 65 63 6b  sion to be check
2b850 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4e  ed */.  Expr *pN
2b860 4e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  N,          /* T
2b870 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
2b880 61 74 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 20 2a  at is NOT NULL *
2b890 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
2b8a0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
2b8b0 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
2b8c0 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 4e 6f   */.  int seenNo
2b8d0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  t         /* Ret
2b8e0 75 72 6e 20 74 72 75 65 20 6f 6e 6c 79 20 69 66  urn true only if
2b8f0 20 70 20 63 61 6e 20 62 65 20 61 6e 79 20 6e 6f   p can be any no
2b900 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a  n-NULL value */.
2b910 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  ){.  assert( p )
2b920 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 4e 20  ;.  assert( pNN 
2b930 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2b940 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2b950 73 65 2c 20 70 2c 20 70 4e 4e 2c 20 69 54 61 62  se, p, pNN, iTab
2b960 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
2b970 72 6e 20 70 4e 4e 2d 3e 6f 70 21 3d 54 4b 5f 4e  rn pNN->op!=TK_N
2b980 55 4c 4c 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  ULL;.  }.  switc
2b990 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
2b9a0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
2b9b0 20 20 20 20 69 66 28 20 73 65 65 6e 4e 6f 74 20      if( seenNot 
2b9c0 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
2b9d0 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
2b9e0 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ct) ) return 0;.
2b9f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
2ba00 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
2ba10 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20  EP_xIsSelect).  
2ba20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e           || (p->
2ba30 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 70 2d  x.pList!=0 && p-
2ba40 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  >x.pList->nExpr>
2ba50 30 29 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  0) );.      retu
2ba60 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f  rn exprImpliesNo
2ba70 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d  tNull(pParse, p-
2ba80 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61  >pLeft, pNN, iTa
2ba90 62 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, 1);.    }.   
2baa0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
2bab0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
2bac0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 2d 3e 78  st *pList = p->x
2bad0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 73  .pList;.      as
2bae0 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
2baf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2bb00 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20  pList->nExpr==2 
2bb10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 65  );.      if( see
2bb20 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e 20 30 3b  nNot ) return 0;
2bb30 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72 49  .      if( exprI
2bb40 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50  mpliesNotNull(pP
2bb50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 30  arse, pList->a[0
2bb60 5d 2e 70 45 78 70 72 2c 20 70 4e 4e 2c 20 69 54  ].pExpr, pNN, iT
2bb70 61 62 2c 20 31 29 0a 20 20 20 20 20 20 20 7c 7c  ab, 1).       ||
2bb80 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2bb90 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ull(pParse, pLis
2bba0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2c 20 70  t->a[1].pExpr, p
2bbb0 4e 4e 2c 20 69 54 61 62 2c 20 31 29 0a 20 20 20  NN, iTab, 1).   
2bbc0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
2bbd0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
2bbe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 78 70        return exp
2bbf0 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2bc00 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66 74  pParse, p->pLeft
2bc10 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 31 29 3b  , pNN, iTab, 1);
2bc20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2bc30 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65 20  TK_EQ:.    case 
2bc40 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
2bc50 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
2bc60 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
2bc70 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
2bc80 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
2bc90 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  TK_PLUS:.    cas
2bca0 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
2bcb0 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
2bcc0 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
2bcd0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
2bce0 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
2bcf0 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 0a 20 20 20   TK_CONCAT: .   
2bd00 20 20 20 73 65 65 6e 4e 6f 74 20 3d 20 31 3b 0a     seenNot = 1;.
2bd10 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
2bd20 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
2bd30 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
2bd40 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
2bd50 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
2bd60 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
2bd70 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72  {.      if( expr
2bd80 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70  ImpliesNotNull(p
2bd90 50 61 72 73 65 2c 20 70 2d 3e 70 52 69 67 68 74  Parse, p->pRight
2bda0 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65  , pNN, iTab, see
2bdb0 6e 4e 6f 74 29 20 29 20 72 65 74 75 72 6e 20 31  nNot) ) return 1
2bdc0 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
2bdd0 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 6e 65  thru into the ne
2bde0 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
2bdf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41  .    case TK_SPA
2be00 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
2be10 4f 4c 4c 41 54 45 3a 0a 20 20 20 20 63 61 73 65  OLLATE:.    case
2be20 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63   TK_UPLUS:.    c
2be30 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
2be40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 78  .      return ex
2be50 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  prImpliesNotNull
2be60 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66  (pParse, p->pLef
2be70 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65  t, pNN, iTab, se
2be80 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20  enNot);.    }.  
2be90 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a    case TK_TRUTH:
2bea0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 65 65   {.      if( see
2beb0 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e 20 30 3b  nNot ) return 0;
2bec0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
2bed0 32 21 3d 54 4b 5f 49 53 20 29 20 72 65 74 75 72  2!=TK_IS ) retur
2bee0 6e 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n 0;.      retur
2bef0 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74  n exprImpliesNot
2bf00 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e  Null(pParse, p->
2bf10 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62  pLeft, pNN, iTab
2bf20 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
2bf30 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
2bf40 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
2bf50 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
2bf60 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2bf70 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  ll(pParse, p->pL
2bf80 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20  eft, pNN, iTab, 
2bf90 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
2bfa0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2bfb0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2bfc0 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74  f we can prove t
2bfd0 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61  he pE2 will alwa
2bfe0 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45  ys be true if pE
2bff0 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52  1 is.** true.  R
2c000 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77  eturn false if w
2c010 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74  e cannot complet
2c020 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69  e the proof or i
2c030 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62  f pE2 might.** b
2c040 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c  e false.  Exampl
2c050 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45  es:.**.**     pE
2c060 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45  1: x==5       pE
2c070 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20  2: x==5         
2c080 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
2c090 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30  .**     pE1: x>0
2c0a0 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d          pE2: x==
2c0b0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65  5             Re
2c0c0 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20  sult: false.**  
2c0d0 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20     pE1: x=21    
2c0e0 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20     pE2: x=21 OR 
2c0f0 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a  y=43     Result:
2c100 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
2c110 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32  : x!=123     pE2
2c120 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2c130 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
2c140 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f  **     pE1: x!=?
2c150 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53  1      pE2: x IS
2c160 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73   NOT NULL    Res
2c170 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
2c180 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20   pE1: x IS NULL 
2c190 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
2c1a0 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66  ULL    Result: f
2c1b0 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  alse.**     pE1:
2c1c0 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a   x IS ?2    pE2:
2c1d0 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
2c1e0 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a    Reuslt: false.
2c1f0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61  **.** When compa
2c200 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  ring TK_COLUMN n
2c210 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31  odes between pE1
2c220 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32   and pE2, if pE2
2c230 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61   has.** Expr.iTa
2c240 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d  ble<0 then assum
2c250 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72  e a table number
2c260 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a   given by iTab..
2c270 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20  **.** If pParse 
2c280 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
2c290 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  n the values of 
2c2a0 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20  bound variables 
2c2b0 69 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a 20 63  in pE1 are .** c
2c2c0 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73 74 20  ompared against 
2c2d0 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20 69  literal values i
2c2e0 6e 20 70 45 32 20 61 6e 64 20 70 50 61 72 73 65  n pE2 and pParse
2c2f0 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b  ->pVdbe->expmask
2c300 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65 64 20   is.** modified 
2c310 74 6f 20 72 65 63 6f 72 64 20 77 68 69 63 68 20  to record which 
2c320 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20  bound variables 
2c330 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 2e 20  are referenced. 
2c340 20 49 66 20 70 50 61 72 73 65 20 0a 2a 2a 20 69   If pParse .** i
2c350 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 61 6c  s NULL, then fal
2c360 73 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  se will be retur
2c370 6e 65 64 20 69 66 20 70 45 31 20 63 6f 6e 74 61  ned if pE1 conta
2c380 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20 76 61  ins any bound va
2c390 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57  riables..**.** W
2c3a0 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
2c3b0 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74  turn false.  Ret
2c3c0 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68  urning true migh
2c3d0 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
2c3e0 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d  ance.** improvem
2c3f0 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ent.  Returning 
2c400 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73  false might caus
2c410 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
2c420 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  reduction, but.*
2c430 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  * it will always
2c440 20 67 69 76 65 20 74 68 65 20 63 6f 72 72 65 63   give the correc
2c450 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20  t answer and is 
2c460 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66  hence always saf
2c470 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2c480 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
2c490 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2c4a0 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20  Expr *pE1, Expr 
2c4b0 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b  *pE2, int iTab){
2c4c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
2c4d0 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
2c4e0 2c 20 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62  , pE1, pE2, iTab
2c4f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
2c500 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
2c510 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20  pE2->op==TK_OR. 
2c520 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70    && (sqlite3Exp
2c530 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50 61  rImpliesExpr(pPa
2c540 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70  rse, pE1, pE2->p
2c550 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20  Left, iTab).    
2c560 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2c570 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
2c580 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20  pr(pParse, pE1, 
2c590 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  pE2->pRight, iTa
2c5a0 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  b) ).  ){.    re
2c5b0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
2c5c0 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  ( pE2->op==TK_NO
2c5d0 54 4e 55 4c 4c 0a 20 20 20 26 26 20 65 78 70 72  TNULL.   && expr
2c5e0 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70  ImpliesNotNull(p
2c5f0 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2c600 3e 70 4c 65 66 74 2c 20 69 54 61 62 2c 20 30 29  >pLeft, iTab, 0)
2c610 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2c620 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2c630 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
2c640 73 20 69 73 20 74 68 65 20 45 78 70 72 20 6e 6f  s is the Expr no
2c650 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  de callback for 
2c660 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2c670 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 29 2e 0a  esNotNullRow()..
2c680 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
2c690 73 69 6f 6e 20 6e 6f 64 65 20 72 65 71 75 69 72  sion node requir
2c6a0 65 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  es that the tabl
2c6b0 65 20 61 74 20 70 57 61 6c 6b 65 72 2d 3e 69 43  e at pWalker->iC
2c6c0 75 72 0a 2a 2a 20 68 61 76 65 20 6f 6e 65 20 6f  ur.** have one o
2c6d0 72 20 6d 6f 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20  r more non-NULL 
2c6e0 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 73 65 74  column, then set
2c6f0 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
2c700 74 6f 20 31 20 61 6e 64 20 61 62 6f 72 74 2e 0a  to 1 and abort..
2c710 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2c720 6e 65 20 63 6f 6e 74 72 6f 6c 73 20 61 6e 20 6f  ne controls an o
2c730 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 46 61  ptimization.  Fa
2c740 6c 73 65 20 70 6f 73 69 74 69 76 65 73 20 28 73  lse positives (s
2c750 65 74 74 69 6e 67 0a 2a 2a 20 70 57 61 6c 6b 65  etting.** pWalke
2c760 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20 77 68  r->eCode to 1 wh
2c770 65 6e 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  en it should not
2c780 20 62 65 29 20 61 72 65 20 64 65 61 64 6c 79 2c   be) are deadly,
2c790 20 62 75 74 20 66 61 6c 73 65 2d 6e 65 67 61 74   but false-negat
2c7a0 69 76 65 73 0a 2a 2a 20 28 6e 65 76 65 72 20 73  ives.** (never s
2c7b0 65 74 74 69 6e 67 20 70 57 61 6c 6b 65 72 2d 3e  etting pWalker->
2c7c0 65 43 6f 64 65 29 20 69 73 20 61 20 68 61 72 6d  eCode) is a harm
2c7d0 6c 65 73 73 20 6d 69 73 73 65 64 20 6f 70 74 69  less missed opti
2c7e0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  mization..*/.sta
2c7f0 74 69 63 20 69 6e 74 20 69 6d 70 6c 69 65 73 4e  tic int impliesN
2c800 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b 65 72  otNullRow(Walker
2c810 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2c820 2a 70 45 78 70 72 29 7b 0a 20 20 74 65 73 74 63  *pExpr){.  testc
2c830 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2c840 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
2c850 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78  .  testcase( pEx
2c860 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
2c870 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66 28  UNCTION );.  if(
2c880 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
2c890 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
2c8a0 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 57 52  oin) ) return WR
2c8b0 43 5f 50 72 75 6e 65 3b 0a 20 20 73 77 69 74 63  C_Prune;.  switc
2c8c0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
2c8d0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
2c8e0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  T:.    case TK_I
2c8f0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
2c900 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 0a 20 20 20 20  TK_NOTNULL:.    
2c910 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
2c920 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
2c930 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a 20 20  case TK_CASE:.  
2c940 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20    case TK_IN:.  
2c950 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
2c960 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
2c970 54 52 55 54 48 3a 0a 20 20 20 20 20 20 74 65 73  TRUTH:.      tes
2c980 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c990 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
2c9a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c9b0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55  xpr->op==TK_ISNU
2c9c0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
2c9d0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2c9e0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
2c9f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2ca00 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
2ca10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2ca20 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2ca30 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _OR );.      tes
2ca40 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2ca50 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20 20 20  ==TK_CASE );.   
2ca60 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2ca70 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
2ca80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2ca90 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46   pExpr->op==TK_F
2caa0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
2cab0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2cac0 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 54 48 20 29  ->op==TK_TRUTH )
2cad0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
2cae0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 63 61  RC_Prune;.    ca
2caf0 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
2cb00 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
2cb10 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70 72 2d 3e  >u.iCur==pExpr->
2cb20 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
2cb30 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2cb40 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
2cb50 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2cb60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2cb70 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2cb80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
2cb90 3a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  :.      if( sqli
2cba0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f  te3ExprImpliesNo
2cbb0 6e 4e 75 6c 6c 52 6f 77 28 70 45 78 70 72 2d 3e  nNullRow(pExpr->
2cbc0 70 4c 65 66 74 2c 20 70 57 61 6c 6b 65 72 2d 3e  pLeft, pWalker->
2cbd0 75 2e 69 43 75 72 29 0a 20 20 20 20 20 20 20 26  u.iCur).       &
2cbe0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  & sqlite3ExprImp
2cbf0 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70  liesNonNullRow(p
2cc00 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 70 57  Expr->pRight, pW
2cc10 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 29 0a 20  alker->u.iCur). 
2cc20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2cc30 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
2cc40 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2cc50 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2cc60 6e 65 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  ne;..    case TK
2cc70 5f 42 45 54 57 45 45 4e 3a 0a 20 20 20 20 20 20  _BETWEEN:.      
2cc80 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2cc90 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d 3e  pWalker, pExpr->
2cca0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 72 65  pLeft);.      re
2ccb0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2ccc0 0a 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20  .    /* Virtual 
2ccd0 74 61 62 6c 65 73 20 61 72 65 20 61 6c 6c 6f 77  tables are allow
2cce0 65 64 20 74 6f 20 75 73 65 20 63 6f 6e 73 74 72  ed to use constr
2ccf0 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e 55 4c  aints like x=NUL
2cd00 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 61 20  L.  So.    ** a 
2cd10 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
2cd20 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20 70 72   x=y does not pr
2cd30 6f 76 65 20 74 68 61 74 20 79 20 69 73 20 6e 6f  ove that y is no
2cd40 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20 20 20  t null if x.    
2cd50 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ** is the column
2cd60 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61   of a virtual ta
2cd70 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ble */.    case 
2cd80 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65 20  TK_EQ:.    case 
2cd90 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
2cda0 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
2cdb0 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
2cdc0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
2cdd0 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74 65 73  TK_GE:.      tes
2cde0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2cdf0 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==TK_EQ );.     
2ce00 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2ce10 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ->op==TK_NE );. 
2ce20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2ce30 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
2ce40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2ce50 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2ce60 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LE );.      tes
2ce70 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2ce80 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
2ce90 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2cea0 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op==TK_GE );. 
2ceb0 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
2cec0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pLeft->op==TK_C
2ced0 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74 75  OLUMN && IsVirtu
2cee0 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  al(pExpr->pLeft-
2cef0 3e 79 2e 70 54 61 62 29 29 0a 20 20 20 20 20 20  >y.pTab)).      
2cf00 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70 52 69 67   || (pExpr->pRig
2cf10 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
2cf20 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70  N && IsVirtual(p
2cf30 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 79 2e  Expr->pRight->y.
2cf40 70 54 61 62 29 29 0a 20 20 20 20 20 20 29 7b 0a  pTab)).      ){.
2cf50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2cf60 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
2cf70 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
2cf80 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2cf90 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
2cfa0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2cfb0 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66  ue (non-zero) if
2cfc0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 61   expression p ca
2cfd0 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69  n only be true i
2cfe0 66 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e  f at least.** on
2cff0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
2d000 65 20 69 54 61 62 20 69 73 20 6e 6f 6e 2d 6e 75  e iTab is non-nu
2d010 6c 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ll.  In other wo
2d020 72 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75 65  rds, return true
2d030 0a 2a 2a 20 69 66 20 65 78 70 72 65 73 73 69 6f  .** if expressio
2d040 6e 20 70 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  n p will always 
2d050 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65  be NULL or false
2d060 20 69 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   if every column
2d070 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e   of iTab.** is N
2d080 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65  ULL..**.** False
2d090 20 6e 65 67 61 74 69 76 65 73 20 61 72 65 20 61   negatives are a
2d0a0 63 63 65 70 74 61 62 6c 65 2e 20 20 49 6e 20 6f  cceptable.  In o
2d0b0 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 69  ther words, it i
2d0c0 73 20 6f 6b 20 74 6f 20 72 65 74 75 72 6e 0a 2a  s ok to return.*
2d0d0 2a 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 65  * zero even if e
2d0e0 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c  xpression p will
2d0f0 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 20 6f   never be true o
2d100 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f  f every column o
2d110 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c  f iTab.** is NUL
2d120 4c 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61  L.  A false nega
2d130 74 69 76 65 20 69 73 20 6d 65 72 65 6c 79 20 61  tive is merely a
2d140 20 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a 61   missed optimiza
2d150 74 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  tion opportunity
2d160 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 70 6f  ..**.** False po
2d170 73 69 74 69 76 65 73 20 61 72 65 20 6e 6f 74 20  sitives are not 
2d180 61 6c 6c 6f 77 65 64 2c 20 68 6f 77 65 76 65 72  allowed, however
2d190 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
2d1a0 69 76 65 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a  ive may result.*
2d1b0 2a 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63  * in an incorrec
2d1c0 74 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20  t answer..**.** 
2d1d0 54 65 72 6d 73 20 6f 66 20 70 20 74 68 61 74 20  Terms of p that 
2d1e0 61 72 65 20 6d 61 72 6b 65 64 20 77 69 74 68 20  are marked with 
2d1f0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64  EP_FromJoin (and
2d200 20 68 65 6e 63 65 20 74 68 61 74 20 63 6f 6d 65   hence that come
2d210 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20   from.** the ON 
2d220 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
2d230 20 6f 66 20 4c 45 46 54 20 4a 4f 49 4e 53 29 20   of LEFT JOINS) 
2d240 61 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f  are excluded fro
2d250 6d 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a  m the analysis..
2d260 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2d270 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
2d280 65 63 6b 20 69 66 20 61 20 4c 45 46 54 20 4a 4f  eck if a LEFT JO
2d290 49 4e 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72  IN can be conver
2d2a0 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f  ted into.** an o
2d2b0 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 20 20 54  rdinary JOIN.  T
2d2c0 68 65 20 70 20 61 72 67 75 6d 65 6e 74 20 69 73  he p argument is
2d2d0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2d2e0 65 2e 20 20 49 66 20 74 68 65 20 57 48 45 52 45  e.  If the WHERE
2d2f0 0a 2a 2a 20 63 6c 61 75 73 65 20 72 65 71 75 69  .** clause requi
2d300 72 65 73 20 74 68 61 74 20 73 6f 6d 65 20 63 6f  res that some co
2d310 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 69 67 68  lumn of the righ
2d320 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 4c  t table of the L
2d330 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e  EFT JOIN.** be n
2d340 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
2d350 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20  e LEFT JOIN can 
2d360 62 65 20 73 61 66 65 6c 79 20 63 6f 6e 76 65 72  be safely conver
2d370 74 65 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f  ted into an.** o
2d380 72 64 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f  rdinary join..*/
2d390 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2d3a0 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f  ImpliesNonNullRo
2d3b0 77 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  w(Expr *p, int i
2d3c0 54 61 62 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  Tab){.  Walker w
2d3d0 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45  ;.  p = sqlite3E
2d3e0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e  xprSkipCollateAn
2d3f0 64 4c 69 6b 65 6c 79 28 70 29 3b 0a 20 20 77 68  dLikely(p);.  wh
2d400 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
2d410 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ( p->op==TK_NOTN
2d420 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 20 3d  ULL ){.      p =
2d430 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 7d   p->pLeft;.    }
2d440 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  else if( p->op==
2d450 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20  TK_AND ){.      
2d460 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
2d470 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77  mpliesNonNullRow
2d480 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  (p->pLeft, iTab)
2d490 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2d4a0 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74     p = p->pRight
2d4b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d4c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2d4d0 20 20 7d 0a 20 20 77 2e 78 45 78 70 72 43 61 6c    }.  w.xExprCal
2d4e0 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65 73 4e  lback = impliesN
2d4f0 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e 78  otNullRow;.  w.x
2d500 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2d510 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   0;.  w.xSelectC
2d520 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20  allback2 = 0;.  
2d530 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77  w.eCode = 0;.  w
2d540 2e 75 2e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  .u.iCur = iTab;.
2d550 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
2d560 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
2d570 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
2d580 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
2d590 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2d5a0 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  g structure is u
2d5b0 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20  sed by the tree 
2d5c0 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74  walker.** to det
2d5d0 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78 70  ermine if an exp
2d5e0 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 65  ression can be e
2d5f0 76 61 6c 75 61 74 65 64 20 62 79 20 72 65 66 65  valuated by refe
2d600 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20  rence to the.** 
2d610 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68  index only, with
2d620 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64 6f  out having to do
2d630 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 74 68   a search for th
2d640 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
2d650 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20  ** table entry. 
2d660 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70 49   The IdxCover.pI
2d670 64 78 20 66 69 65 6c 64 20 69 73 20 74 68 65 20  dx field is the 
2d680 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65 72  index.  IdxCover
2d690 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65 20  .iCur.** is the 
2d6a0 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
2d6b0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  able..*/.struct 
2d6c0 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64  IdxCover {.  Ind
2d6d0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a  ex *pIdx;     /*
2d6e0 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
2d6f0 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76 65   tested for cove
2d700 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  rage */.  int iC
2d710 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ur;        /* Cu
2d720 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
2d730 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73  the table corres
2d740 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69  ponding to the i
2d750 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ndex */.};../*.*
2d760 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2d770 66 20 74 68 65 72 65 20 61 72 65 20 72 65 66 65  f there are refe
2d780 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
2d790 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70  s in table .** p
2d7a0 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
2d7b0 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62 65  ver->iCur can be
2d7c0 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67   satisfied using
2d7d0 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57   the index.** pW
2d7e0 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
2d7f0 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61  er->pIdx..*/.sta
2d800 74 69 63 20 69 6e 74 20 65 78 70 72 49 64 78 43  tic int exprIdxC
2d810 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  over(Walker *pWa
2d820 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
2d830 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  r){.  if( pExpr-
2d840 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
2d850 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62    && pExpr->iTab
2d860 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  le==pWalker->u.p
2d870 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20  IdxCover->iCur. 
2d880 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c 75    && sqlite3Colu
2d890 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b 65  mnOfIndex(pWalke
2d8a0 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
2d8b0 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f  pIdx, pExpr->iCo
2d8c0 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20  lumn)<0.  ){.   
2d8d0 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
2d8e0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
2d8f0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
2d900 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2d910 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  inue;.}../*.** D
2d920 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 69  etermine if an i
2d930 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61 62  ndex pIdx on tab
2d940 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
2d950 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c  Cur contains wil
2d960 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  l.** the express
2d970 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74 75  ion pExpr.  Retu
2d980 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
2d990 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72 20  ndex does cover 
2d9a0 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2d9b0 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  n and false if t
2d9c0 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73  he pExpr express
2d9d0 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74  ion references t
2d9e0 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  able columns.** 
2d9f0 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f 75  that are not fou
2da00 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  nd in the index 
2da10 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69  pIdx..**.** An i
2da20 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61 6e  ndex covering an
2da30 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e   expression mean
2da40 73 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  s that the expre
2da50 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20  ssion can be.** 
2da60 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20  evaluated using 
2da70 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20 61  only the index a
2da80 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  nd without havin
2da90 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a  g to lookup the.
2daa0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
2dab0 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f   table entry..*/
2dac0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2dad0 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 0a  CoveredByIndex(.
2dae0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
2daf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
2db00 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ex to be tested 
2db10 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
2db20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2db30 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
2db40 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  r the correspond
2db50 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49  ing table */.  I
2db60 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2db70 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
2db80 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 75 73  that might be us
2db90 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20  ed for coverage 
2dba0 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  */.){.  Walker w
2dbb0 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78 43 6f  ;.  struct IdxCo
2dbc0 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73  ver xcov;.  mems
2dbd0 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
2dbe0 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75  (w));.  xcov.iCu
2dbf0 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f 76  r = iCur;.  xcov
2dc00 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20  .pIdx = pIdx;.  
2dc10 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
2dc20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b 0a  = exprIdxCover;.
2dc30 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72 20    w.u.pIdxCover 
2dc40 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74  = &xcov;.  sqlit
2dc50 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
2dc60 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  Expr);.  return 
2dc70 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a  !w.eCode;.}.../*
2dc80 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2dc90 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2dca0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
2dcb0 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77  ed by the tree w
2dcc0 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e  alker.** to coun
2dcd0 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  t references to 
2dce0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  table columns in
2dcf0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f   the arguments o
2dd00 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61  f an .** aggrega
2dd10 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20  te function, in 
2dd20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65  order to impleme
2dd30 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  nt the.** sqlite
2dd40 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63  3FunctionThisSrc
2dd50 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
2dd60 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b  truct SrcCount {
2dd70 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2dd80 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69  ;   /* One parti
2dd90 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73  cular FROM claus
2dda0 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75  e in a nested qu
2ddb0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68  ery */.  int nTh
2ddc0 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  is;       /* Num
2ddd0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2dde0 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
2ddf0 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  pSrcList */.  in
2de00 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f  t nOther;      /
2de10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
2de20 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
2de30 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20  s in other FROM 
2de40 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  clauses */.};../
2de50 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
2de60 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2de70 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a  ces to columns..
2de80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
2de90 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65  prSrcCount(Walke
2dea0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2deb0 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54   *pExpr){.  /* T
2dec0 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68  he NEVER() on th
2ded0 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73  e second term is
2dee0 20 62 65 63 61 75 73 65 20 73 71 6c 69 74 65 33   because sqlite3
2def0 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
2df00 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c  Src().  ** is al
2df10 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  ways called befo
2df20 72 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  re sqlite3ExprAn
2df30 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2df40 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a  ) and so the.  *
2df50 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76  * TK_COLUMNs hav
2df60 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  e not yet been c
2df70 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b  onverted into TK
2df80 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66  _AGG_COLUMN.  If
2df90 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e  .  ** sqlite3Fun
2dfa0 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
2dfb0 28 29 20 69 73 20 75 73 65 64 20 64 69 66 66 65  () is used diffe
2dfc0 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75  rently in the fu
2dfd0 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e  ture, the.  ** N
2dfe0 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64  EVER() will need
2dff0 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20   to be removed. 
2e000 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
2e010 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
2e020 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70   NEVER(pExpr->op
2e030 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29  ==TK_AGG_COLUMN)
2e040 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2e050 20 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75     struct SrcCou
2e060 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d  nt *p = pWalker-
2e070 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20  >u.pSrcCount;.  
2e080 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
2e090 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
2e0a0 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f  nt nSrc = pSrc ?
2e0b0 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b   pSrc->nSrc : 0;
2e0c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2e0d0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
2e0e0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
2e0f0 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e  ble==pSrc->a[i].
2e100 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
2e110 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2e120 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70  <nSrc ){.      p
2e130 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d  ->nThis++;.    }
2e140 65 6c 73 65 20 69 66 28 20 6e 53 72 63 3d 3d 30  else if( nSrc==0
2e150 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
2e160 65 3c 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  e<pSrc->a[0].iCu
2e170 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rsor ){.      /*
2e180 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
2e190 64 20 70 61 72 73 65 20 74 72 65 65 20 28 6e 6f  d parse tree (no
2e1a0 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
2e1b0 20 65 72 72 6f 72 73 29 2c 0a 20 20 20 20 20 20   errors),.      
2e1c0 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  ** TK_COLUMN nod
2e1d0 65 73 20 77 69 74 68 20 73 6d 61 6c 6c 65 72 20  es with smaller 
2e1e0 45 78 70 72 2e 69 54 61 62 6c 65 20 76 61 6c 75  Expr.iTable valu
2e1f0 65 73 20 61 72 65 20 69 6e 20 61 6e 0a 20 20 20  es are in an.   
2e200 20 20 20 2a 2a 20 6f 75 74 65 72 20 63 6f 6e 74     ** outer cont
2e210 65 78 74 2e 20 20 54 68 6f 73 65 20 61 72 65 20  ext.  Those are 
2e220 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 73 20 74 6f  the only ones to
2e230 20 63 6f 75 6e 74 20 61 73 20 22 6f 74 68 65 72   count as "other
2e240 22 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  " */.      p->nO
2e250 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ther++;.    }.  
2e260 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2e270 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2e280 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
2e290 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ny of the argume
2e2a0 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72  nts to the pExpr
2e2b0 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65   Function refere
2e2c0 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e  nce.** pSrcList.
2e2d0 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
2e2e0 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20   they do.  Also 
2e2f0 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  return true if t
2e300 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  he function.** h
2e310 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  as no arguments 
2e320 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73  or has only cons
2e330 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
2e340 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
2e350 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65   pExpr.** refere
2e360 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74  nces columns but
2e370 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   not columns of 
2e380 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20  tables found in 
2e390 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74  pSrcList..*/.int
2e3a0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2e3b0 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72  UsesThisSrc(Expr
2e3c0 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74   *pExpr, SrcList
2e3d0 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57   *pSrcList){.  W
2e3e0 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
2e3f0 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a  t SrcCount cnt;.
2e400 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
2e410 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
2e420 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74  TION );.  memset
2e430 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
2e440 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ));.  w.xExprCal
2e450 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43  lback = exprSrcC
2e460 6f 75 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63  ount;.  w.xSelec
2e470 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
2e480 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f  te3SelectWalkNoo
2e490 70 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75  p;.  w.u.pSrcCou
2e4a0 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74  nt = &cnt;.  cnt
2e4b0 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74  .pSrc = pSrcList
2e4c0 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20  ;.  cnt.nThis = 
2e4d0 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20  0;.  cnt.nOther 
2e4e0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  = 0;.  sqlite3Wa
2e4f0 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70  lkExprList(&w, p
2e500 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
2e510 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68    return cnt.nTh
2e520 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68  is>0 || cnt.nOth
2e530 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  er==0;.}../*.** 
2e540 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
2e550 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
2e560 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
2e570 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
2e580 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
2e590 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
2e5a0 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2e5b0 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
2e5c0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2e5d0 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
2e5e0 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  umn(sqlite3 *db,
2e5f0 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
2e600 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
2e610 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74  fo->aCol = sqlit
2e620 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
2e630 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  .       db,.    
2e640 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a     pInfo->aCol,.
2e650 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
2e660 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20  nfo->aCol[0]),. 
2e670 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
2e680 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69  olumn,.       &i
2e690 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
2e6a0 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
2e6b0 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
2e6c0 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
2e6d0 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
2e6e0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
2e6f0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
2e700 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
2e710 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2e720 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
2e730 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2e740 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
2e750 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
2e760 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
2e770 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
2e780 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
2e790 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
2e7a0 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
2e7b0 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
2e7c0 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
2e7d0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
2e7e0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
2e7f0 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69  nFunc,.       &i
2e800 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
2e810 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
2e820 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72  his is the xExpr
2e830 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74  Callback for a t
2e840 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20  ree walker.  It 
2e850 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d  is used to.** im
2e860 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45  plement sqlite3E
2e870 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2e880 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
2e890 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2e8a0 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
2e8b0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2e8c0 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
2e8d0 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
2e8e0 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a  gregate(Walker *
2e8f0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2e900 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
2e910 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
2e920 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
2e930 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
2e940 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
2e950 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
2e960 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
2e970 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
2e980 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
2e990 4e 43 2d 3e 75 4e 43 2e 70 41 67 67 49 6e 66 6f  NC->uNC.pAggInfo
2e9a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  ;..  assert( pNC
2e9b0 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 55  ->ncFlags & NC_U
2e9c0 41 67 67 49 6e 66 6f 20 29 3b 0a 20 20 73 77 69  AggInfo );.  swi
2e9d0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
2e9e0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
2e9f0 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
2ea00 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
2ea10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ea20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2ea30 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
2ea40 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2ea50 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2ea60 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   );.      /* Che
2ea70 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2ea80 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
2ea90 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
2eaa0 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
2eab0 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
2eac0 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
2ead0 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
2eae0 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21  ALWAYS(pSrcList!
2eaf0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
2eb00 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2eb10 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
2eb20 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
2eb30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
2eb40 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
2eb50 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2eb60 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2eb70 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
2eb80 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2eb90 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2eba0 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
2ebb0 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
2ebc0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
2ebd0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
2ebe0 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
2ebf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ec00 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
2ec10 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
2ec20 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
2ec30 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
2ec40 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2ec50 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
2ec60 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
2ec70 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
2ec80 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
2ec90 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
2eca0 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
2ecb0 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
2ecc0 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
2ecd0 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
2ece0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
2ecf0 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
2ed00 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
2ed10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ed20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
2ed30 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
2ed40 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
2ed50 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2ed60 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
2ed70 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
2ed80 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
2ed90 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2eda0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
2edb0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
2edc0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2edd0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2ede0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2edf0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2ee00 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2ee10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2ee20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2ee30 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
2ee40 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
2ee50 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
2ee60 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
2ee70 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
2ee80 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
2ee90 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2eea0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
2eeb0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
2eec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2eed0 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
2eee0 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20  r->y.pTab;.     
2eef0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2ef00 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
2ef10 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
2ef20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
2ef30 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
2ef40 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
2ef50 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
2ef60 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2ef80 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2ef90 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2efa0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
2efb0 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
2efc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
2efd0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
2efe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2eff0 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
2f000 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
2f010 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
2f020 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
2f030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f040 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2f050 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
2f060 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
2f070 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
2f080 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
2f090 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2f0a0 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
2f0b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2f0c0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2f0d0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
2f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0f0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2f100 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
2f110 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
2f120 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
2f130 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
2f140 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2f150 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f170 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2f180 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
2f190 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2f1a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2f1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f1c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f1d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f1e0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2f1f0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
2f200 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2f210 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2f220 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
2f230 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
2f240 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
2f250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2f260 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2f270 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
2f280 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
2f290 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
2f2a0 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
2f2b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
2f2c0 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
2f2d0 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
2f2e0 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
2f2f0 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
2f300 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
2f310 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
2f320 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
2f330 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
2f340 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
2f350 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
2f360 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
2f370 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2f380 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
2f390 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2f3a0 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2f3b0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2f3c0 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
2f3d0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2f3e0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
2f3f0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
2f400 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2f410 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
2f420 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2f430 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
2f440 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
2f450 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2f460 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
2f470 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
2f480 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
2f490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2f4a0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2f4b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
2f4c0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
2f4d0 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
2f4e0 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
2f4f0 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
2f500 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
2f510 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
2f520 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
2f530 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2f540 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
2f550 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
2f560 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
2f570 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
2f580 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
2f590 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2f5a0 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
2f5b0 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
2f5c0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2f5d0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
2f5e0 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
2f5f0 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
2f600 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2f610 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
2f620 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2f630 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2f640 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65  rCompare(0, pIte
2f650 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
2f660 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
2f670 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2f680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f690 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2f6a0 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
2f6b0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
2f6c0 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
2f6d0 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
2f6e0 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
2f6f0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
2f700 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2f710 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
2f720 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
2f730 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
2f740 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
2f750 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
2f760 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f770 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
2f780 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2f790 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2f7a0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2f7b0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2f7c0 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
2f7d0 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
2f7e0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2f7f0 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
2f800 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2f810 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
2f820 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2f830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2f840 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2f850 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
2f860 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2f870 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
2f880 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
2f890 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
2f8a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f8b0 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
2f8c0 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ken, .          
2f8d0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2f8e0 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  x.pList ? pExpr-
2f8f0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
2f900 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
2f910 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2f920 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
2f930 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2f940 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2f950 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
2f960 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2f970 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2f990 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2f9a0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
2f9b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2f9c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f9d0 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
2f9e0 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
2f9f0 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
2fa00 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
2fa10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2fa20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2fa30 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2fa40 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
2fa50 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2fa60 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
2fa70 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
2fa80 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2fa90 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
2faa0 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20  gg = (i16)i;.   
2fab0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
2fac0 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
2fad0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2fae0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
2faf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fb00 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2fb10 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2fb20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2fb30 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2fb40 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2fb50 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2fb60 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
2fb70 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
2fb80 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
2fb90 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
2fba0 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ct);.  pWalker->
2fbb0 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20  walkerDepth++;. 
2fbc0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2fbd0 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76  inue;.}.static v
2fbe0 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  oid analyzeAggre
2fbf0 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64  gatesInSelectEnd
2fc00 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2fc10 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2fc20 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2fc30 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
2fc40 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  .  pWalker->walk
2fc50 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a  erDepth--;.}../*
2fc60 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
2fc70 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
2fc80 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
2fc90 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
2fca0 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
2fcb0 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
2fcc0 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41  to be added to A
2fcd0 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  ggInfo object th
2fce0 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f  at pNC->pAggInfo
2fcf0 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  .** points to.  
2fd00 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  Additional entri
2fd10 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74  es are made on t
2fd20 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  he AggInfo objec
2fd30 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72  t as.** necessar
2fd40 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2fd50 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2fd60 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
2fd70 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
2fd80 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
2fd90 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
2fda0 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
2fdb0 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
2fdc0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2fdd0 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
2fde0 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
2fdf0 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
2fe00 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
2fe10 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2fe20 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
2fe30 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2fe40 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2fe50 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
2fe60 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2fe70 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2fe80 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b  atesInSelectEnd;
2fe90 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68  .  w.walkerDepth
2fea0 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20   = 0;.  w.u.pNC 
2feb0 3d 20 70 4e 43 3b 0a 20 20 77 2e 70 50 61 72 73  = pNC;.  w.pPars
2fec0 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
2fed0 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
2fee0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  0 );.  sqlite3Wa
2fef0 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
2ff00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
2ff10 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2ff20 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
2ff30 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
2ff40 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
2ff50 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
2ff60 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2ff70 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
2ff80 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
2ff90 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
2ffa0 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
2ffb0 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
2ffc0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2ffd0 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
2ffe0 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
2fff0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
30000 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
30010 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
30020 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
30030 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
30040 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
30050 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
30060 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
30070 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
30080 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
30090 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
300a0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
300b0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
300c0 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67  a single new reg
300d0 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f  ister for use to
300e0 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72   hold some inter
300f0 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a  mediate result..
30100 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
30110 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
30120 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
30130 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d  Parse->nTempReg=
30140 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
30150 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
30160 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
30170 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
30180 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
30190 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  g];.}../*.** Dea
301a0 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
301b0 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c  er, making avail
301c0 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66  able for reuse f
301d0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
301e0 20 70 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69   purpose..*/.voi
301f0 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
30200 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
30210 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
30220 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
30230 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
30240 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
30250 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
30260 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
30270 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
30280 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
30290 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
302a0 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
302b0 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
302c0 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
302d0 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69   registers..*/.i
302e0 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
302f0 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
30300 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
30310 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
30320 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74  f( nReg==1 ) ret
30330 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65  urn sqlite3GetTe
30340 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
30350 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61   i = pParse->iRa
30360 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50  ngeReg;.  n = pP
30370 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b  arse->nRangeReg;
30380 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29  .  if( nReg<=n )
30390 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  {.    pParse->iR
303a0 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b  angeReg += nReg;
303b0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
303c0 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a  ngeReg -= nReg;.
303d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d    }else{.    i =
303e0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
303f0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
30400 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20  m += nReg;.  }. 
30410 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69   return i;.}.voi
30420 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
30430 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
30440 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
30450 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
30460 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
30470 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
30480 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
30490 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75   iReg);.    retu
304a0 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  rn;.  }.  if( nR
304b0 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
304c0 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
304d0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
304e0 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
304f0 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
30500 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
30510 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
30520 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
30530 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
30540 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2a  le for reuse..**
30550 0a 2a 2a 20 41 6c 77 61 79 73 20 69 6e 76 6f 6b  .** Always invok
30560 65 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  e this procedure
30570 20 61 66 74 65 72 20 63 6f 64 69 6e 67 20 61 20   after coding a 
30580 73 75 62 72 6f 75 74 69 6e 65 20 6f 72 20 63 6f  subroutine or co
30590 2d 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 68 61 74  -routine.** that
305a0 20 6d 69 67 68 74 20 62 65 20 69 6e 76 6f 6b 65   might be invoke
305b0 64 20 66 72 6f 6d 20 6f 74 68 65 72 20 70 61 72  d from other par
305c0 74 73 20 6f 66 20 74 68 65 20 63 6f 64 65 2c 20  ts of the code, 
305d0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 0a 2a  to ensure that.*
305e0 2a 20 74 68 65 20 73 75 62 2f 63 6f 2d 72 6f 75  * the sub/co-rou
305f0 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  tine does not us
30600 65 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 63  e registers in c
30610 6f 6d 6d 6f 6e 20 77 69 74 68 20 74 68 65 20 63  ommon with the c
30620 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6e 76 6f  ode that.** invo
30630 6b 65 73 20 74 68 65 20 73 75 62 2f 63 6f 2d 72  kes the sub/co-r
30640 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  outine..*/.void 
30650 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
30660 52 65 67 43 61 63 68 65 28 50 61 72 73 65 20 2a  RegCache(Parse *
30670 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73  pParse){.  pPars
30680 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b  e->nTempReg = 0;
30690 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  .  pParse->nRang
306a0 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  eReg = 0;.}../*.
306b0 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68 61 74  ** Validate that
306c0 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65   no temporary re
306d0 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74  gister falls wit
306e0 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66  hin the range of
306f0 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73  .** iFirst..iLas
30700 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54  t, inclusive.  T
30710 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
30720 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69  nly call from wi
30730 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a  thin assert().**
30740 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
30750 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
30760 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e  BUG.int sqlite3N
30770 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61  oTempsInRange(Pa
30780 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
30790 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61   iFirst, int iLa
307a0 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
307b0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  if( pParse->nRan
307c0 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50  geReg>0.   && pP
307d0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b  arse->iRangeReg+
307e0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
307f0 67 20 3e 20 69 46 69 72 73 74 0a 20 20 20 26 26  g > iFirst.   &&
30800 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
30810 65 67 20 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b  eg <= iLast.  ){
30820 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  .     return 0;.
30830 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
30840 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  <pParse->nTempRe
30850 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  g; i++){.    if(
30860 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
30870 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20  g[i]>=iFirst && 
30880 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
30890 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20  [i]<=iLast ){.  
308a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
308b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
308c0 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
308d0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.