/ Hex Artifact Content
Login

Artifact bb148f4c45b6e53b5b58a912974253547e8862685cb001fbdfaef0ab24812e6f:


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 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
0fd0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29  3ExprNNCollSeq()
0fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
0ff0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1000: 29 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65  ) works the same
1010: 20 65 78 61 63 74 20 74 68 61 74 20 69 74 20 72   exact that it r
1020: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65  eturns the.** de
1030: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1040: 69 66 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20  if pExpr has no 
1050: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
1060: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  n..**.** The col
1070: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1080: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
1090: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
10a0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
10b0: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
10c0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
10d0: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
10f0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
1100: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
1110: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
1120: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
1130: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
1140: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
1150: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1160: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1170: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1180: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1190: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
11b0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
11c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
11d0: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
11e0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
11f0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >op;.    if( p->
1200: 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72  flags & EP_Gener
1210: 69 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ic ) break;.    
1220: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
1230: 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  || op==TK_UPLUS 
1240: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  ){.      p = p->
1250: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f 6e  pLeft;.      con
1260: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1270: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   if( op==TK_COLL
1280: 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52  ATE || (op==TK_R
1290: 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 6f 70  EGISTER && p->op
12a0: 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 29 20 29  2==TK_COLLATE) )
12b0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
12c0: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
12d0: 71 28 70 50 61 72 73 65 2c 20 45 4e 43 28 64 62  q(pParse, ENC(db
12e0: 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  ), 0, p->u.zToke
12f0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1310: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1320: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1330: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  MN.          || 
1340: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
1350: 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45  || op==TK_TRIGGE
1360: 52 29 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 54  R).     && p->pT
1370: 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ab!=0.    ){.   
1380: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
1390: 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62  ISTER && p->pTab
13a0: 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e  !=0 happens when
13b0: 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69   pExpr was origi
13c0: 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61  nally.      ** a
13d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77   TK_COLUMN but w
13e0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76  as previously ev
13f0: 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68  aluated and cach
1400: 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
1410: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 20   */.      int j 
1420: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
1430: 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a      if( j>=0 ){.
1440: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1450: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70  ar *zColl = p->p
1460: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
1470: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  ll;.        pCol
1480: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
1490: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
14a0: 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20  b), zColl, 0);. 
14b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14d0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
14e0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
14f0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26   if( p->pLeft &&
1500: 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67   (p->pLeft->flag
1510: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
1520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20  =0 ){.        p 
1530: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
1540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1550: 20 45 78 70 72 20 2a 70 4e 65 78 74 20 20 3d 20   Expr *pNext  = 
1560: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1570: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
1580: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
1590: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
15a0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
15b0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
15c0: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
15d0: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
15e0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
15f0: 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20 68 6f 6c   /* p->flags hol
1600: 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65 20 61 6e  ds EP_Collate an
1610: 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  d p->pLeft->flag
1620: 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20 41 6e 64  s does not.  And
1630: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 78  .        ** p->x
1640: 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e 6f 74 2e  .pSelect cannot.
1650: 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e 70 4c 65    So if p->x.pLe
1660: 66 74 20 65 78 69 73 74 73 2c 20 69 74 20 6d 75  ft exists, it mu
1670: 73 74 20 68 6f 6c 64 20 61 74 0a 20 20 20 20 20  st hold at.     
1680: 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20     ** least one 
1690: 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54 68 75 73  EP_Collate. Thus
16a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
16b0: 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f 0a 20 20  wo ALWAYS. */.  
16c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 2e 70        if( p->x.p
16d0: 4c 69 73 74 21 3d 30 20 26 26 20 41 4c 57 41 59  List!=0 && ALWAY
16e0: 53 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  S(!ExprHasProper
16f0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
1700: 63 74 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ct)) ){.        
1710: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41     for(i=0; ALWA
1730: 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  YS(i<p->x.pList-
1740: 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a 20  >nExpr); i++){. 
1750: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 45             if( E
1760: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1770: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1780: 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61 74  pExpr, EP_Collat
1790: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
17a0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78      pNext = p->x
17b0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
17c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1800: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
1810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1820: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
1830: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1840: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
1850: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
1860: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
1870: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1880: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
1890: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
18a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18b0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
18c0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
18d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
18e0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
18f0: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
1900: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1910: 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f 6c 6c  .** defautl coll
1920: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
1930: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1950: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
1960: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1970: 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  q() routine work
1980: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
1990: 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72 65 74  t that it.** ret
19a0: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
19b0: 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64  re is no defined
19c0: 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 43   collation..*/.C
19d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
19e0: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50 61 72  xprNNCollSeq(Par
19f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1a00: 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c   *pExpr){.  Coll
1a10: 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Seq *p = sqlite3
1a20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1a30: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  se, pExpr);.  if
1a40: 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70 50 61  ( p==0 ) p = pPa
1a50: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1a60: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  ll;.  assert( p!
1a70: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
1a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a90: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 74 77  n TRUE if the tw
1aa0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 68 61  o expressions ha
1ab0: 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  ve equivalent co
1ac0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ad0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1ae0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63  3ExprCollSeqMatc
1af0: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
1b00: 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
1b10: 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c 53 65   *pE2){.  CollSe
1b20: 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71 6c 69  q *pColl1 = sqli
1b30: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b40: 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b 0a 20  (pParse, pE1);. 
1b50: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32   CollSeq *pColl2
1b60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
1b70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b80: 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  pE2);.  return s
1b90: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ba0: 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f  oll1->zName, pCo
1bb0: 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 3b 0a  ll2->zName)==0;.
1bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1bd0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
1be0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1bf0: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1c00: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1c10: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1c20: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1c30: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c40: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1c50: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1c60: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1c70: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1c80: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
1c90: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1ca0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
1cb0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
1cc0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
1cd0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1ce0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1cf0: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1d00: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1d10: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1d20: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1d30: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1d40: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1d50: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1d60: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1d70: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1d80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1d90: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1da0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
1db0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1dc0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
1dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1de0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1e00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1e10: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1e20: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1e30: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1e40: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1e50: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1e60: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1e70: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1e80: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1e90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1eb0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ec0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ed0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1ee0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1ef0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1f00: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1f10: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1f20: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1f30: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1f40: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1f50: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1f60: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1f70: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1f80: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1f90: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1fa0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1fb0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1fc0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1fd0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1fe0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1ff0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
2000: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
2010: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
2020: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
2030: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2040: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
2050: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
2060: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
2070: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
2080: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
2090: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
20a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
20b0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
20c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
20d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
20e0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
20f0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
2100: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
2110: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2120: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2130: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2140: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
2150: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2160: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
2170: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
2180: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
2190: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21a0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
21b0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
21c0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
21f0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
2200: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
2210: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
2220: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
2230: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
2240: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
2250: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
2260: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
2270: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
2280: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
2290: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
22a0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
22b0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
22c0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
22d0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
22e0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
22f0: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
2300: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
2310: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
2320: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
2330: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
2340: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
2350: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
2360: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
2370: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
2380: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
2390: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
23a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
23b0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
23c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
23d0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
23e0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
23f0: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2400: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2410: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2420: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2430: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2440: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2460: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2470: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2480: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
2490: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
24a0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
24b0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
24c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
24d0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
24e0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
24f0: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2500: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2510: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2520: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2530: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2540: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2550: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2560: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2570: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2580: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
2590: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
25a0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
25b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25c0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
25d0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
25e0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
25f0: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2600: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2610: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2620: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2630: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2640: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2650: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2660: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2670: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2680: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
2690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
26a0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
26b0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
26c0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
26d0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
26e0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
26f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2700: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2710: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2720: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2730: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2740: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2750: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2760: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2770: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2780: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
2790: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
27a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27b0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
27c0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
27d0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
27e0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
27f0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2800: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2810: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2820: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2830: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2840: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2850: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2860: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2870: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2880: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
2890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
28a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
28b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
28c0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
28d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
28e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
28f0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2900: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2910: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2920: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2940: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2950: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2960: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2970: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2980: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
2990: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
29a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
29b0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
29c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
29d0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
29e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
29f0: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2a00: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2a10: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2a20: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2a30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2a40: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2a50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2a70: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2a80: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
2a90: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
2aa0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
2ab0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
2ac0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
2ad0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
2ae0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2af0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2b00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2b10: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2b20: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2b30: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2b40: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2b50: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2b60: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2b70: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2b80: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
2b90: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
2ba0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2bb0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
2bc0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
2bd0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2c00: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2c10: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2c20: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2c30: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2c40: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2c60: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2c70: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2c80: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
2c90: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
2ca0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
2cb0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
2cc0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
2cd0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
2ce0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2cf0: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2d00: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2d10: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2d20: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2d30: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2d40: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2d50: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2d60: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2d70: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2d80: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
2d90: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
2da0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
2db0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
2dc0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
2dd0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
2de0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2e00: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2e10: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2e20: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2e30: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2e60: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2e70: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2e80: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2e90: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ea0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2eb0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ec0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ed0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2ee0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2ef0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2f00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2f10: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2f20: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2f30: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2f40: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2f50: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2f60: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2f70: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2f80: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2fb0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2fc0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2fd0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2fe0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2ff0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
3000: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
3010: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
3020: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
3030: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
3040: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
3050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3060: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
3070: 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70  bexpression of p
3080: 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74  Vector that is t
3090: 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d  he i-th.** colum
30a0: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
30b0: 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69  (numbered starti
30c0: 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65  ng with 0).  The
30d0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
30e0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73  ensure that i is
30f0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a   within range..*
3100: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3110: 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6c  is really a scal
3120: 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72 22  ar (and "scalar"
3130: 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20 73   here includes s
3140: 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68 61  ubqueries.** tha
3150: 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  t return a singl
3160: 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20  e column!) then 
3170: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20 75  return pVector u
3180: 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  nmodified..**.**
3190: 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e 73   pVector retains
31a0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
31b0: 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65 78  e returned subex
31c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
31d0: 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69 73  If the vector is
31e0: 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20   a (SELECT ...) 
31f0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
3200: 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73 0a  ion returned is.
3210: 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70 72  ** just the expr
3220: 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69  ession for the i
3230: 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
3240: 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
3250: 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65  may.** not be re
3260: 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ady for evaluati
3270: 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 74  on because the t
3280: 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73 20  able cursor has 
3290: 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
32a0: 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45  positioned..*/.E
32b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74  xpr *sqlite3Vect
32c0: 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45  orFieldSubexpr(E
32d0: 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e  xpr *pVector, in
32e0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
32f0: 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  i<sqlite3ExprVec
3300: 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29  torSize(pVector)
3310: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
3320: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56  3ExprIsVector(pV
3330: 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61 73  ector) ){.    as
3340: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f  sert( pVector->o
3350: 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72  p2==0 || pVector
3360: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
3370: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56 65  R );.    if( pVe
3380: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3390: 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e  ECT || pVector->
33a0: 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  op2==TK_SELECT )
33b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
33c0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
33d0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
33e0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
33f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
3400: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3410: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3420: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3430: 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  pVector;.}../*.*
3440: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
3450: 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20  turn a new Expr 
3460: 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65  object which whe
3470: 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73  n passed to.** s
3480: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
3490: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61   will generate a
34a0: 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64  ll necessary cod
34b0: 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  e to compute.** 
34c0: 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f  the iField-th co
34d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
34e0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56  or expression pV
34f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ector..**.** It 
3500: 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f  is ok for pVecto
3510: 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  r to be a scalar
3520: 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69   (as long as iFi
3530: 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e  eld==0).  .** In
3540: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
3550: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
3560: 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44  ike sqlite3ExprD
3570: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  up()..**.** The 
3580: 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20  caller owns the 
3590: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
35a0: 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70  ject and is resp
35b0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65  onsible for.** e
35c0: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
35d0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
35e0: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
35f0: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  freed..**.** The
3600: 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20   caller retains 
3610: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65  ownership of pVe
3620: 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f  ctor.  If pVecto
3630: 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54  r is a TK_SELECT
3640: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
3650: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77 69  turned object wi
3660: 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56 65  ll reference pVe
3670: 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63  ctor and so pVec
3680: 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a  tor must remain.
3690: 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ** valid for the
36a0: 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65 74   life of the ret
36b0: 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49  urned object.  I
36c0: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
36d0: 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61  K_VECTOR.** or a
36e0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
36f0: 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20  on, then it can 
3700: 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f  be deleted as so
3710: 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74 69  on as this routi
3720: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a  ne.** returns..*
3730: 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20  *.** A trick to 
3740: 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43  cause a TK_SELEC
3750: 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20  T pVector to be 
3760: 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72  deleted together
3770: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74   with.** the ret
3780: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3790: 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20 74  t is to attach t
37a0: 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68  he pVector to th
37b0: 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a  e pRight field.*
37c0: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
37d0: 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  d TK_SELECT_COLU
37e0: 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a  MN Expr object..
37f0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3800: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
3810: 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ld(.  Parse *pPa
3820: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3830: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3840: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3850: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
3860: 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20  ector.  List of 
3870: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61  expressions or a
3880: 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20   sub-SELECT */. 
3890: 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20   int iField     
38a0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
38b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
38c0: 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  tor to return */
38d0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74  .){.  Expr *pRet
38e0: 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d  ;.  if( pVector-
38f0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
3900: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  {.    assert( pV
3910: 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45  ector->flags & E
3920: 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20  P_xIsSelect );. 
3930: 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c     /* The TK_SEL
3940: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
3950: 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  node:.    **.   
3960: 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20   ** pLeft:      
3970: 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e       pVector con
3980: 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43  taining TK_SELEC
3990: 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e  T.  Not deleted.
39a0: 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20  .    ** pRight: 
39b0: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65           not use
39c0: 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76  d.  But recursiv
39d0: 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  ely deleted..   
39e0: 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20   ** iColumn:    
39f0: 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20       Index of a 
3a00: 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f  column in pVecto
3a10: 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a  r.    ** iTable:
3a20: 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20 74            0 or t
3a30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
3a40: 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53 20  umns on the LHS 
3a50: 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74  of an assignment
3a60: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
3a70: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
3a80: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
3a90: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3aa0: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3ab0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3ac0: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
3ad0: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
3ae0: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
3af0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
3b00: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
3b10: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3b20: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3b30: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3b40: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
3b50: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
3b60: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
3b70: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
3b80: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
3b90: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
3ba0: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3bb0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
3bc0: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
3bd0: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
3be0: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
3bf0: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
3c00: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3c10: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3c20: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3c30: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3c40: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3c50: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
3c60: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
3c70: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
3c80: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3c90: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3ca0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3cb0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
3cc0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Ret ){.      pRe
3cd0: 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69  t->iColumn = iFi
3ce0: 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  eld;.      pRet-
3cf0: 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72  >pLeft = pVector
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3d10: 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70  rt( pRet==0 || p
3d20: 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  Ret->iTable==0 )
3d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3d40: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
3d50: 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63  TK_VECTOR ) pVec
3d60: 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  tor = pVector->x
3d70: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
3d80: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65  ].pExpr;.    pRe
3d90: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
3da0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
3db0: 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a  Vector, 0);.  }.
3dc0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
3de0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f  ssion pExpr is o
3df0: 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54  f type TK_SELECT
3e00: 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
3e10: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69  to evaluate.** i
3e20: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  t. Return the re
3e30: 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20  gister in which 
3e40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
3e50: 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65  ored (or, if the
3e60: 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
3e70: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3e80: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  n one column, th
3e90: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3ea0: 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74  ray.** of regist
3eb0: 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65  ers in which the
3ec0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3ed0: 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  d)..**.** If pEx
3ee0: 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53  pr is not a TK_S
3ef0: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3f00: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
3f10: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
3f20: 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
3f30: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3f40: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
3f50: 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  eg = 0;.#ifndef 
3f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3f70: 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
3f80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3f90: 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c  ){.    reg = sql
3fa0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
3fb0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
3fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
3fd0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b  if.  return reg;
3fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
3ff0: 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74  nt pVector point
4000: 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78  s to a vector ex
4010: 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65  pression - eithe
4020: 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  r a TK_VECTOR.**
4030: 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68   or TK_SELECT th
4040: 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  at returns more 
4050: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e  than one column.
4060: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4070: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65  eturns.** the re
4080: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66  gister number of
4090: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
40a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
40b0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  lue of.** elemen
40c0: 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20  t iField of the 
40d0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  vector..**.** If
40e0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
40f0: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
4100: 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  on, then code fo
4110: 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a  r it must have .
4120: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4130: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
4140: 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73  the exprCodeSubs
4150: 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e  elect() routine.
4160: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
4170: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65   parameter regSe
4180: 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74  lect should be t
4190: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
41a0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
41b0: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s.** containing 
41c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
41d0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a  he sub-select. .
41e0: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
41f0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
4200: 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65  ECTOR, then code
4210: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
4220: 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67  ed field.** is g
4230: 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69  enerated. In thi
4240: 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65  s case (*pRegFre
4250: 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  e) may be set to
4260: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
4270: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  * a temporary re
4280: 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65  gister to be fre
4290: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
42a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
42b0: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
42c0: 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75  returning, outpu
42d0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70  t parameter (*pp
42e0: 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20  Expr) is set to 
42f0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4300: 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72  Expr object corr
4310: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65  esponding to ele
4320: 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68  ment iElem of th
4330: 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61  e vector..*/.sta
4340: 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74  tic int exprVect
4350: 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  orRegister(.  Pa
4360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
4390: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
43a0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
43b0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f      /* Vector to
43c0: 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74   extract element
43d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
43e0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4400: 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66  eld to extract f
4410: 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20  rom pVector */. 
4420: 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20   int regSelect, 
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
4450: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4460: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
4470: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
4480: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70       /* OUT: Exp
4490: 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20  ression element 
44a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72  */.  int *pRegFr
44b0: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
44c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d       /* OUT: Tem
44d0: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
44e0: 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70  ee */.){.  u8 op
44f0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a   = pVector->op;.
4500: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
4510: 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54  _VECTOR || op==T
4520: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70  K_REGISTER || op
4530: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
4540: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
4550: 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45  STER ){.    *ppE
4560: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63  xpr = sqlite3Vec
4570: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
4580: 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29  pVector, iField)
4590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 65  ;.    return pVe
45a0: 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69  ctor->iTable+iFi
45b0: 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  eld;.  }.  if( o
45c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
45d0: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56      *ppExpr = pV
45e0: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
45f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65  ->pEList->a[iFie
4600: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ld].pExpr;.     
4610: 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74  return regSelect
4620: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a  +iField;.  }.  *
4630: 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72  ppExpr = pVector
4640: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
4650: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65  eld].pExpr;.  re
4660: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
4670: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
4680: 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72   *ppExpr, pRegFr
4690: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ee);.}../*.** Ex
46a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
46b0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  s a comparison b
46c0: 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f  etween two vecto
46d0: 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74  r values. Comput
46e0: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
46f0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4700: 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c  n (1, 0, or NULL
4710: 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  ) and write that
4720: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  .** result into 
4730: 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a  register dest..*
4740: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4750: 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65  must satisfy the
4760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f   following preco
4770: 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  nditions:.**.** 
4780: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
4790: 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d  =TK_IS:      op=
47a0: 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53  =TK_EQ and p5==S
47b0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
47c0: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
47d0: 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d  =TK_ISNOT:   op=
47e0: 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53  =TK_NE and p5==S
47f0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
4800: 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20     otherwise:   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d               op=
4820: 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70  =pExpr->op and p
4830: 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76  5==0.*/.static v
4840: 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f  oid codeVectorCo
4850: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
4860: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
4870: 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  * Code generator
4880: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4890: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
48a0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
48b0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
48c0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
48d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
48e0: 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
48f0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4900: 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20  /.  u8 op,      
4910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
4920: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4930: 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
4940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4950: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20  QLITE_NULLEQ or 
4960: 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  zero */.){.  Vdb
4970: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4980: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c  Vdbe;.  Expr *pL
4990: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
49a0: 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft;.  Expr *pRig
49b0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
49c0: 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20  ht;.  int nLeft 
49d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
49e0: 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
49f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4a00: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e  egLeft = 0;.  in
4a10: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
4a20: 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20    u8 opx = op;. 
4a30: 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20   int addrDone = 
4a40: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4a50: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  abel(v);..  if( 
4a60: 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45 78  nLeft!=sqlite3Ex
4a70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69  prVectorSize(pRi
4a80: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
4a90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4aa0: 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
4ab0: 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72 65  isused");.    re
4ac0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4ad0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
4ae0: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
4af0: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
4b20: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20  p==TK_ISNOT .   
4b30: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72  ==TK_LT || pExpr
4b50: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20  ->op==TK_GT .   
4b60: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b70: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72  ==TK_LE || pExpr
4b80: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29  ->op==TK_GE .  )
4b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
4ba0: 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45  r->op==op || (pE
4bb0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26  xpr->op==TK_IS &
4bc0: 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20  & op==TK_EQ).   
4bd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78           || (pEx
4be0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
4bf0: 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29   && op==TK_NE) )
4c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c10: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d  0 || pExpr->op!=
4c20: 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  op );.  assert( 
4c30: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
4c40: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
4c50: 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53  op );..  p5 |= S
4c60: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20  QLITE_STOREP2;. 
4c70: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20   if( opx==TK_LE 
4c80: 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20  ) opx = TK_LT;. 
4c90: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20   if( opx==TK_GE 
4ca0: 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a  ) opx = TK_GT;..
4cb0: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4cc0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4cd0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4ce0: 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43  regRight = exprC
4cf0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
4d00: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20  rse, pRight);.. 
4d10: 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f   for(i=0; 1 /*Lo
4d20: 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65  op exits by "bre
4d30: 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20  ak"*/; i++){.   
4d40: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
4d50: 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  0, regFree2 = 0;
4d60: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a  .    Expr *pL, *
4d70: 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c  pR; .    int r1,
4d80: 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28   r2;.    assert(
4d90: 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74   i>=0 && i<nLeft
4da0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20   );.    if( i>0 
4db0: 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  ) sqlite3ExprCac
4dc0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
4dd0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4de0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4df0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4e00: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e10: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e20: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e30: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e40: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e50: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e60: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e70: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e80: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e90: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4ea0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4eb0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4ec0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ed0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ee0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ef0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f00: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f10: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f20: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f30: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f40: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f50: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f60: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f70: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f80: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f90: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4fa0: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fb0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fc0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fd0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fe0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4ff0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5000: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5010: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5020: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5030: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5040: 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70  i>0 ) sqlite3Exp
5050: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
5060: 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c  );.    if( i==nL
5070: 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62  eft-1 ){.      b
5080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5090: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29  if( opx==TK_EQ )
50a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
50b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
50c0: 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64  IfNot, dest, add
50d0: 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65  rDone); VdbeCove
50e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70  rage(v);.      p
50f0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
5100: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
5110: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29  if( opx==TK_NE )
5120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5130: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5140: 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f  If, dest, addrDo
5150: 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ne); VdbeCoverag
5160: 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c  e(v);.      p5 |
5170: 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  = SQLITE_KEEPNUL
5180: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
5190: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
51a0: 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  TK_LT || op==TK_
51b0: 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20  GT || op==TK_LE 
51c0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  || op==TK_GE );.
51d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c  eAddOp2(v, OP_El
51f0: 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72  seNotEq, 0, addr
5200: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  Done);.      Vdb
5210: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
5220: 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20  p==TK_LT);.     
5230: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
5240: 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20  v, op==TK_GT);. 
5250: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5260: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45  eIf(v, op==TK_LE
5270: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5280: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
5290: 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28  K_GE);.      if(
52a0: 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70   i==nLeft-2 ) op
52b0: 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  x = op;.    }.  
52c0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
52d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
52e0: 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66  ddrDone);.}..#if
52f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
5300: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
5310: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
5320: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
5330: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
5340: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
5350: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
5360: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
5370: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
5380: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5390: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
53a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
53b0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
53c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
53d0: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
53e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
53f0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
5400: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
5410: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5420: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
5430: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
5440: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
5450: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5460: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
5470: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
5480: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
5490: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
54a0: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
54b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
54c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
54d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
54e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
54f0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
5500: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
5510: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
5520: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
5530: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
5540: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
5550: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
5560: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
5570: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
5580: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
5590: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
55a0: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
55b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
55c0: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
55d0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
55e0: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
55f0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
5600: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
5610: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
5620: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
5630: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
5640: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
5650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5660: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
5670: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5680: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5690: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
56a0: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
56b0: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
56c0: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
56d0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
56e0: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
56f0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
5700: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5710: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5720: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
5730: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
5740: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
5750: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
5760: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
5770: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
5780: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5790: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
57a0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20  t *pSelect, int 
57b0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65  *pnHeight){.  Se
57c0: 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70  lect *p;.  for(p
57d0: 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70  =pSelect; p; p=p
57e0: 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68  ->pPrior){.    h
57f0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5800: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
5810: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5820: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
5830: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5840: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5850: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
5860: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5870: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
5880: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5890: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
58a0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
58b0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
58c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
58d0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
58e0: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
58f0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
5900: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
5910: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
5920: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
5930: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
5940: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
5950: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
5960: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
5970: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
5980: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
5990: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
59a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
59b0: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
59c0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
59d0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
59e0: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
59f0: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
5a00: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
5a10: 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67  pagate EP_Propag
5a20: 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f  ate flags up fro
5a30: 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74  m Expr.x.pList t
5a40: 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a  o Expr.flags,.**
5a50: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
5a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a70: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
5a80: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
5a90: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5aa0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
5ab0: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
5ac0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5ad0: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
5ae0: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
5af0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5b00: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5b10: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
5b20: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
5b30: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
5b40: 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74  e if( p->x.pList
5b50: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
5b60: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
5b70: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
5b80: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20      p->flags |= 
5b90: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73  EP_Propagate & s
5ba0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
5bb0: 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  ags(p->x.pList);
5bc0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
5bd0: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
5be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
5bf0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
5c00: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
5c10: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
5c20: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
5c30: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
5c40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
5c50: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
5c60: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
5c70: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
5c80: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
5c90: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61  **.** Also propa
5ca0: 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70  gate all EP_Prop
5cb0: 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d  agate flags from
5cc0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
5cd0: 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66  t into.** Expr.f
5ce0: 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  lags. .*/.void s
5cf0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
5d00: 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73  ghtAndFlags(Pars
5d10: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
5d20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  *p){.  if( pPars
5d30: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
5d40: 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68  ;.  exprSetHeigh
5d50: 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t(p);.  sqlite3E
5d60: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
5d70: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
5d80: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
5d90: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
5da0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78  height of any ex
5db0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
5dc0: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74  ferenced.** by t
5dd0: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
5de0: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
5df0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
5e00: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  t sqlite3SelectE
5e10: 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74  xprHeight(Select
5e20: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5e30: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5e40: 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48  tOfSelect(p, &nH
5e50: 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e  eight);.  return
5e60: 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73   nHeight;.}.#els
5e70: 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69  e /* ABOVE:  Hei
5e80: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
5e90: 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a  enabled.  BELOW:
5ea0: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
5eb0: 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a  ent off */./*.**
5ec0: 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   Propagate all E
5ed0: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
5ee0: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
5ef0: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
5f00: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
5f10: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5f20: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
5f30: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
5f40: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5f50: 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74   p && p->x.pList
5f60: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
5f70: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
5f80: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  lect) ){.    p->
5f90: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
5fa0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
5fb0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
5fc0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  x.pList);.  }.}.
5fd0: 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48  #define exprSetH
5fe0: 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20  eight(y).#endif 
5ff0: 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  /* SQLITE_MAX_EX
6000: 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f  PR_DEPTH>0 */../
6010: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6020: 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c  e is the core al
6030: 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72  locator for Expr
6040: 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f   nodes..**.** Co
6050: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
6060: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
6070: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
6080: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
6090: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
60a0: 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  de and for the p
60b0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69  Token argument i
60c0: 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  s a single alloc
60d0: 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65  ation.** obtaine
60e0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
60f0: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
6100: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
6110: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
6120: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
6130: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
6140: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
6150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ..**.** If dequo
6160: 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
6170: 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69   the token (if i
6180: 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71  t exists) is deq
6190: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71  uoted..** If deq
61a0: 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e  uote is false, n
61b0: 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70  o dequoting is p
61c0: 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64  erformed.  The d
61d0: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
61e0: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
61f0: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
6200: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
6210: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
6220: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
6230: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
6240: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
6250: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
6260: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
6270: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
6280: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
6290: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
62a0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
62b0: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
62c0: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
62d0: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
62e0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
62f0: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
6300: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
6310: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
6320: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
6330: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
6340: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
6350: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
6360: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
6370: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
6380: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
6390: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
63a0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
63b0: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
63c0: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
63d0: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
63e0: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
63f0: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
6400: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
6410: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
6420: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
6430: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
6440: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6450: 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74  RawNN() */.  int
6460: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6470: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6480: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
6490: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
64a0: 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  en,    /* Token 
64b0: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
64c0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
64d0: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
64e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
64f0: 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20   dequote */.){. 
6500: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
6510: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
6520: 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b   int iValue = 0;
6530: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
6540: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
6550: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21  n ){.    if( op!
6560: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70  =TK_INTEGER || p
6570: 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20  Token->z==0.    
6580: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
6590: 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d  GetInt32(pToken-
65a0: 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20  >z, &iValue)==0 
65b0: 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  ){.      nExtra 
65c0: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20  = pToken->n+1;. 
65d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61       assert( iVa
65e0: 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  lue>=0 );.    }.
65f0: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c    }.  pNew = sql
6600: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
6610: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
6620: 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66  r)+nExtra);.  if
6630: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65  ( pNew ){.    me
6640: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
6650: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20  zeof(Expr));.   
6660: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
6670: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
6680: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
6690: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
66a0: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
66b0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
66c0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
66d0: 61 6c 75 65 7c 45 50 5f 4c 65 61 66 3b 0a 20 20  alue|EP_Leaf;.  
66e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
66f0: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
6700: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6710: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6720: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  en = (char*)&pNe
6730: 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  w[1];.        as
6740: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
6750: 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d  =0 || pToken->n=
6760: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
6770: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65  ( pToken->n ) me
6780: 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  mcpy(pNew->u.zTo
6790: 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ken, pToken->z, 
67a0: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
67b0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
67c0: 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20  en[pToken->n] = 
67d0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  0;.        if( d
67e0: 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65  equote && sqlite
67f0: 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Isquote(pNew->u
6800: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
6810: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
6820: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  w->u.zToken[0]==
6830: 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67  '"' ) pNew->flag
6840: 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65  s |= EP_DblQuote
6850: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  d;.          sql
6860: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
6870: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
6880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6890: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
68a0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
68b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  .    pNew->nHeig
68c0: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
68d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
68e0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
68f0: 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  ocate a new expr
6900: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d  ession node from
6910: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
6920: 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  ed token that ha
6930: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65  s.** already bee
6940: 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45  n dequoted..*/.E
6950: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
6960: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
6980: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
6990: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
69a0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
69b0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
69c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
69d0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
69e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
69f0: 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20  *zToken      /* 
6a00: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
6a10: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6a20: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a  /.){.  Token x;.
6a30: 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a    x.z = zToken;.
6a40: 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    x.n = sqlite3S
6a50: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 3b  trlen30(zToken);
6a60: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
6a70: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f  3ExprAlloc(db, o
6a80: 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  p, &x, 0);.}../*
6a90: 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74 72  .** Attach subtr
6aa0: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
6ab0: 69 67 68 74 20 74 6f 20 74 68 65 20 45 78 70 72  ight to the Expr
6ac0: 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a   node pRoot..**.
6ad0: 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c  ** If pRoot==NUL
6ae0: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  L that means tha
6af0: 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  t a memory alloc
6b00: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
6b10: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20  occurred..** In 
6b20: 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74  that case, delet
6b30: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 70  e the subtrees p
6b40: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
6b50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6b60: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
6b70: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  es(.  sqlite3 *d
6b80: 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74  b,.  Expr *pRoot
6b90: 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  ,.  Expr *pLeft,
6ba0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a  .  Expr *pRight.
6bb0: 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d  ){.  if( pRoot==
6bc0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
6bd0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6be0: 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
6bf0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
6c00: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
6c10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
6c20: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
6c30: 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  e{.    if( pRigh
6c40: 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  t ){.      pRoot
6c50: 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68  ->pRight = pRigh
6c60: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6c70: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6c80: 61 67 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e  agate & pRight->
6c90: 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20  flags;.    }.   
6ca0: 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20   if( pLeft ){.  
6cb0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74      pRoot->pLeft
6cc0: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
6cd0: 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pRoot->flags |= 
6ce0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70  EP_Propagate & p
6cf0: 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Left->flags;.   
6d00: 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65   }.    exprSetHe
6d10: 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d  ight(pRoot);.  }
6d20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
6d30: 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20  te an Expr node 
6d40: 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d  which joins as m
6d50: 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72  any as two subtr
6d60: 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f  ees..**.** One o
6d70: 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75  r both of the su
6d80: 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55  btrees can be NU
6d90: 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  LL.  Return a po
6da0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
6db0: 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  .** Expr node.  
6dc0: 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  Or, if an OOM er
6dd0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
6de0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
6df0: 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65  ocFailed,.** fre
6e00: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61  e the subtrees a
6e10: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
6e20: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6e30: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
6e40: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
6e50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6e60: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
6e90: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
6ea0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
6eb0: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
6ec0: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
6ed0: 69 67 68 74 20 20 20 20 20 20 20 20 20 20 20 20  ight            
6ee0: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
6ef0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
6f00: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
6f10: 4e 44 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45  ND && pParse->nE
6f20: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  rr==0 ){.    /* 
6f30: 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  Take advantage o
6f40: 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20  f short-circuit 
6f50: 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  false optimizati
6f60: 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20  on for AND */.  
6f70: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
6f80: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
6f90: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
6fa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
6fb0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6fc0: 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64  cRawNN(pParse->d
6fd0: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
6fe0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
6ff0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
7000: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
7010: 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f  .      p->op = o
7020: 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a  p & TKFLG_MASK;.
7030: 20 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d 20        p->iAgg = 
7040: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  -1;.    }.    sq
7050: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
7060: 75 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e  ubtrees(pParse->
7070: 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52  db, p, pLeft, pR
7080: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ight);.  }.  if(
7090: 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74   p ) {.    sqlit
70a0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
70b0: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
70c0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ight);.  }.  ret
70d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
70e0: 41 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74  Add pSelect to t
70f0: 68 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  he Expr.x.pSelec
7100: 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66  t field.  Or, if
7110: 20 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28   pExpr is NULL (
7120: 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f  due.** do a memo
7130: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
7140: 69 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65  ilure) then dele
7150: 74 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f  te the pSelect o
7160: 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
7170: 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
7180: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
7190: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
71a0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
71b0: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  ){.  if( pExpr )
71c0: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70  {.    pExpr->x.p
71d0: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
71e0: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  ;.    ExprSetPro
71f0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7200: 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62  xIsSelect|EP_Sub
7210: 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  query);.    sqli
7220: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
7230: 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c  AndFlags(pParse,
7240: 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65   pExpr);.  }else
7250: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7260: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
7270: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
7280: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
7290: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
72a0: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  elect);.  }.}...
72b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
72c0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
72d0: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
72e0: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
72f0: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
7300: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
7310: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
7320: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
7330: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
7340: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
7350: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
7360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
7370: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
7380: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
7390: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
73a0: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
73b0: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
73c0: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
73d0: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
73e0: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
73f0: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
7400: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
7410: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
7420: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
7430: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
7440: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
7450: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
7460: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
7470: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
7480: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7490: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
74a0: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
74b0: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
74c0: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
74d0: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
74e0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
74f0: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
7500: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
7510: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
7520: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
7530: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
7540: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
7550: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
7560: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
7570: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
7580: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
7590: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
75a0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
75b0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
75c0: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
75d0: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
75e0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
75f0: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
7600: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7610: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
7620: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7630: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
7640: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
7650: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
7660: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
7670: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
7680: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
7690: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
76a0: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
76b0: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
76c0: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
76d0: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
76e0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
76f0: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
7700: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
7710: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
7720: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
7730: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
7740: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
7750: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
7760: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
7770: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
7780: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
7790: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
77a0: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
77b0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
77c0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
77d0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
77e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
77f0: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
7800: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
7810: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
7820: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
7830: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
7840: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
7850: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
7860: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
7870: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7880: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
7890: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
78a0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
78b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
78c0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
78d0: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
78e0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
78f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
7900: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
7910: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7920: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
7930: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
7940: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
7950: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
7960: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
7970: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
7980: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
7990: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
79a0: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
79b0: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
79c0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
79d0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
79e0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  xprFunction(Pars
79f0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
7a00: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
7a10: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
7a20: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69  pr *pNew;.  sqli
7a30: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7a40: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
7a50: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
7a60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
7a70: 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54  loc(db, TK_FUNCT
7a80: 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b  ION, pToken, 1);
7a90: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
7aa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
7ab0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
7ac0: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
7ad0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65   memory leak whe
7ae0: 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  n malloc fails *
7af0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
7b00: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c    }.  pNew->x.pL
7b10: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45  ist = pList;.  E
7b20: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
7b30: 4e 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29  New, EP_HasFunc)
7b40: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
7b50: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7b60: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
7b70: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
7b80: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
7b90: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
7ba0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
7bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
7bc0: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
7bd0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
7be0: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
7bf0: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
7c00: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
7c10: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
7c20: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7c30: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
7c40: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
7c50: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
7c60: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
7c70: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
7c80: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7c90: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
7ca0: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
7cb0: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
7cc0: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
7cd0: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
7ce0: 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69 64  too big to avoid
7cf0: 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72   a denial of ser
7d00: 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e  vice attack when
7d10: 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74  .** the SQL stat
7d20: 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d  ement comes from
7d30: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75   an external sou
7d40: 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  rce..**.** Wildc
7d50: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
7d60: 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c   ":aaa", "@aaa",
7d70: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
7d80: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
7d90: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
7da0: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
7db0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
7dc0: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
7dd0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
7de0: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
7df0: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
7e00: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7e10: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
7e20: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
7e30: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
7e40: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
7e50: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
7e60: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
7e70: 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c  r, u32 n){.  sql
7e80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7e90: 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e->db;.  const c
7ea0: 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20  har *z;.  ynVar 
7eb0: 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  x;..  if( pExpr=
7ec0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
7ed0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
7ee0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
7ef0: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
7f00: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
7f10: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
7f20: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
7f30: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
7f40: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
7f50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
7f60: 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33 53 74  ==(u32)sqlite3St
7f70: 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69  rlen30(z) );.  i
7f80: 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20  f( z[1]==0 ){.  
7f90: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
7fa0: 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20   the form "?".  
7fb0: 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20  Assign the next 
7fc0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7fd0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  */.    assert( z
7fe0: 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20  [0]=='?' );.    
7ff0: 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  x = (ynVar)(++pP
8000: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d  arse->nVar);.  }
8010: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f  else{.    int do
8020: 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Add = 0;.    if(
8030: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
8040: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
8050: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
8060: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
8070: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
8080: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
8090: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
80a0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
80b0: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
80c0: 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20    int bOk;.     
80d0: 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f   if( n==2 ){ /*O
80e0: 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54  PTIMIZATION-IF-T
80f0: 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20 69 20  RUE*/.        i 
8100: 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20  = z[1]-'0';  /* 
8110: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
8120: 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67  of ?N for a sing
8130: 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20  le digit N */.  
8140: 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20        bOk = 1;. 
8150: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8160: 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c      bOk = 0==sql
8170: 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d  ite3Atoi64(&z[1]
8180: 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54  , &i, n-1, SQLIT
8190: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d  E_UTF8);.      }
81a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
81b0: 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   i==0 );.      t
81c0: 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b  estcase( i==1 );
81d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
81e0: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
81f0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8200: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29  ABLE_NUMBER]-1 )
8210: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8220: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
8230: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
8240: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b  IABLE_NUMBER] );
8250: 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d  .      if( bOk==
8260: 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62  0 || i<1 || i>db
8270: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8280: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8290: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
82a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
82b0: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
82c0: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
82d0: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
82e0: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
82f0: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53      db->aLimit[S
8300: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8310: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20  ABLE_NUMBER]);. 
8320: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
8330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78 20 3d       }.      x =
8340: 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20   (ynVar)i;.     
8350: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
8360: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Var ){.        p
8370: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69  Parse->nVar = (i
8380: 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20 64 6f  nt)x;.        do
8390: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
83a0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
83b0: 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70  VListNumToName(p
83c0: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78  Parse->pVList, x
83d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
83e0: 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20  doAdd = 1;.     
83f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8400: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73      /* Wildcards
8410: 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24   like ":aaa", "$
8420: 61 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20  aaa" or "@aaa". 
8430: 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   Reuse the same 
8440: 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
8450: 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  * number as the 
8460: 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65  prior appearance
8470: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
8480: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  e, or if the nam
8490: 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  e.      ** has n
84a0: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
84b0: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
84c0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
84d0: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mber.      */.  
84e0: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 73      x = (ynVar)s
84f0: 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d 65 54  qlite3VListNameT
8500: 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c  oNum(pParse->pVL
8510: 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  ist, z, n);.    
8520: 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20    if( x==0 ){.  
8530: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
8540: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
8550: 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64  );.        doAdd
8560: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
8570: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 41 64    }.    if( doAd
8580: 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  d ){.      pPars
8590: 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71 6c 69  e->pVList = sqli
85a0: 74 65 33 56 4c 69 73 74 41 64 64 28 64 62 2c 20  te3VListAdd(db, 
85b0: 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20  pParse->pVList, 
85c0: 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a  z, n, x);.    }.
85d0: 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f    }.  pExpr->iCo
85e0: 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20  lumn = x;.  if( 
85f0: 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  x>db->aLimit[SQL
8600: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8610: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
8620: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8630: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8640: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
8650: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
8660: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
8670: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
8680: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  on tree..*/.stat
8690: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
86a0: 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  NE void sqlite3E
86b0: 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  xprDeleteNN(sqli
86c0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
86d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
86e0: 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  0 );.  /* Sanity
86f0: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
8700: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
8710: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
8720: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
8730: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
8740: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8750: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
8760: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
8770: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8780: 45 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48  EBUG.  if( ExprH
8790: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
87a0: 5f 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48  _Leaf) && !ExprH
87b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
87c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
87d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
87e0: 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  eft==0 );.    as
87f0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
8800: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
8810: 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d  ( p->x.pSelect==
8820: 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0 );.  }.#endif.
8830: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
8840: 6f 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f  operty(p, (EP_To
8850: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
8860: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
8870: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
8880: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
8890: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
88a0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
88b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70    assert( p->x.p
88c0: 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  List==0 || p->pR
88d0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
88e0: 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70  f( p->pLeft && p
88f0: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op!=TK_SELECT_
8900: 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33  COLUMN ) sqlite3
8910: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8920: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20   p->pLeft);.    
8930: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b  if( p->pRight ){
8940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
8950: 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70  prDeleteNN(db, p
8960: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
8970: 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73  else if( ExprHas
8980: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
8990: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
89a0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
89b0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
89c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
89d0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
89e0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
89f0: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
8a00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8a10: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8a20: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20  (p, EP_Reduced) 
8a30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8a40: 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 64 62 2c  WindowDelete(db,
8a50: 20 70 2d 3e 70 57 69 6e 29 3b 0a 20 20 20 20 7d   p->pWin);.    }
8a60: 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48  .  }.  if( ExprH
8a70: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8a80: 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c  _MemToken) ) sql
8a90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8aa0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69  ->u.zToken);.  i
8ab0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8ac0: 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63  rty(p, EP_Static
8ad0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8ae0: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
8af0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
8b00: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
8b10: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
8b20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73  *p){.  if( p ) s
8b30: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8b40: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  NN(db, p);.}../*
8b50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
8b60: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
8b70: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
8b80: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75   expression stru
8b90: 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64  cture .** passed
8ba0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
8bb0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
8bc0: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58  always one of EX
8bd0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20  PR_FULLSIZE,.** 
8be0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8bf0: 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   or EXPR_TOKENON
8c00: 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  LYSIZE..*/.stati
8c10: 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74  c int exprStruct
8c20: 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  Size(Expr *p){. 
8c30: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8c40: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8c50: 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45  Only) ) return E
8c60: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
8c70: 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  E;.  if( ExprHas
8c80: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
8c90: 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e  educed) ) return
8ca0: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
8cb0: 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52  E;.  return EXPR
8cc0: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  _FULLSIZE;.}../*
8cd0: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8ce0: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
8cf0: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
8d00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
8d10: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
8d20: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
8d30: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
8d40: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
8d50: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
8d60: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
8d70: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
8d80: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
8d90: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
8da0: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
8db0: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
8dc0: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
8dd0: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
8de0: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
8df0: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
8e00: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
8e10: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
8e20: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
8e30: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
8e40: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
8e50: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
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 0a 2a  **************.*
8ea0: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
8eb0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
8ec0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
8ed0: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
8ee0: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
8ef0: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
8f00: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
8f10: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
8f20: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
8f30: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
8f40: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
8f50: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
8f60: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
8f70: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
8f80: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
8f90: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
8fa0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
8fb0: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
8fc0: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
8fd0: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
8fe0: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
8ff0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
9000: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
9010: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
9020: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
9030: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
9040: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
9050: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
9060: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
9070: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
9080: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
9090: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
90a0: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
90b0: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
90c0: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
90d0: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
90e0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
90f0: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
9100: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
9110: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
9120: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
9130: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
9140: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
9150: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
9160: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
9170: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
9180: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
9190: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
91a0: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
91b0: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
91c0: 66 20 74 68 65 20 45 78 70 72 20 6f 62 6a 65 63  f the Expr objec
91d0: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
91e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
91f0: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
9200: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
9210: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
9220: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
9230: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
9240: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
9250: 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  an EXPRDUP_REDUC
9260: 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75  E copy of a redu
9270: 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ced expression. 
9280: 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61   It is only lega
9290: 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61  l.** to reduce a
92a0: 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73   pristine expres
92b0: 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74  sion tree from t
92c0: 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20  he parser.  The 
92d0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
92e0: 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74  * of dupedExprSt
92f0: 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61  ructSize() conta
9300: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65  in multiple asse
9310: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
9320: 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20  that attempt.** 
9330: 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
9340: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
9350: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
9360: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
9370: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
9380: 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a  ){.  int nSize;.
9390: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
93a0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
93b0: 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f  || flags==0 ); /
93c0: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20  * Only one flag 
93d0: 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  value allowed */
93e0: 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f  .  assert( EXPR_
93f0: 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20  FULLSIZE<=0xfff 
9400: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78  );.  assert( (0x
9410: 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65  fff & (EP_Reduce
9420: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29  d|EP_TokenOnly))
9430: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d  ==0 );.  if( 0==
9440: 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  flags || p->op==
9450: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
9460: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
9470: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
9480: 0a 20 20 20 7c 7c 20 70 2d 3e 70 57 69 6e 20 0a  .   || p->pWin .
9490: 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
94a0: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c  nSize = EXPR_FUL
94b0: 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LSIZE;.  }else{.
94c0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
94d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
94e0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
94f0: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
9500: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9510: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
9520: 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20  romJoin) ); .   
9530: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
9540: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9550: 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20  MemToken) );.   
9560: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
9570: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9580: 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20  NoReduce) );.   
9590: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c   if( p->pLeft ||
95a0: 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20   p->x.pList ){. 
95b0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
95c0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20  R_REDUCEDSIZE | 
95d0: 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20  EP_Reduced;.    
95e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
95f0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
9600: 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65  0 );.      nSize
9610: 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c   = EXPR_TOKENONL
9620: 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e  YSIZE | EP_Token
9630: 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Only;.    }.  }.
9640: 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a    return nSize;.
9650: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
9660: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
9670: 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65  he space in byte
9680: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  s required to st
9690: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a  ore the copy .**
96a0: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
96b0: 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70  ucture and a cop
96c0: 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e  y of the Expr.u.
96d0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
96e0: 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67  f that.** string
96f0: 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f   is defined.).*/
9700: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
9710: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78  dExprNodeSize(Ex
9720: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
9730: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
9740: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
9750: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26  Size(p, flags) &
9760: 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45   0xfff;.  if( !E
9770: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9780: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
9790: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
97a0: 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71  .    nByte += sq
97b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
97c0: 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20  >u.zToken)+1;.  
97d0: 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  }.  return ROUND
97e0: 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  8(nByte);.}../*.
97f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
9800: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
9810: 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65  quired to create
9820: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
9830: 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  the .** expressi
9840: 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65  on passed as the
9850: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
9860: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
9870: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73  ment is a.** mas
9880: 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50  k containing EXP
9890: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
98a0: 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
98b0: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
98c0: 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74  s space to creat
98d0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
98e0: 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69  Expr struct.** i
98f0: 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75  tself and the bu
9900: 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f  ffer referred to
9910: 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65   by Expr.u.zToke
9920: 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a  n, if any..**.**
9930: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
9940: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
9950: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  et, then the ret
9960: 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64  urn value includ
9970: 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20  es .** space to 
9980: 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78  duplicate all Ex
9990: 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20  pr nodes in the 
99a0: 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45  tree formed by E
99b0: 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e  xpr.pLeft .** an
99c0: 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61  d Expr.pRight va
99d0: 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74  riables (but not
99e0: 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75   for any structu
99f0: 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f  res pointed to o
9a00: 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20  r .** descended 
9a10: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
9a20: 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e  pList or Expr.x.
9a30: 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65  pSelect variable
9a40: 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s)..*/.static in
9a50: 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  t dupedExprSize(
9a60: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
9a70: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
9a80: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b   = 0;.  if( p ){
9a90: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70  .    nByte = dup
9aa0: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70  edExprNodeSize(p
9ab0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
9ac0: 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f  ( flags&EXPRDUP_
9ad0: 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20  REDUCE ){.      
9ae0: 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78  nByte += dupedEx
9af0: 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c  prSize(p->pLeft,
9b00: 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45   flags) + dupedE
9b10: 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68  xprSize(p->pRigh
9b20: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  t, flags);.    }
9b30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42  .  }.  return nB
9b40: 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  yte;.}../*.** Th
9b50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
9b60: 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
9b70: 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65  3ExprDup(), exce
9b80: 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66  pt that if pzBuf
9b90: 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e  fer .** is not N
9ba0: 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66  ULL then *pzBuff
9bb0: 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
9bc0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
9bd0: 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  er large enough 
9be0: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65  .** to store the
9bf0: 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
9c00: 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65  ion p, the copie
9c10: 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  s of p->u.zToken
9c20: 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62  .** (if applicab
9c30: 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70  le), and the cop
9c40: 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c  ies of the p->pL
9c50: 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68  eft and p->pRigh
9c60: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  t expressions,.*
9c70: 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65  * if any. Before
9c80: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42   returning, *pzB
9c90: 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20  uffer is set to 
9ca0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
9cb0: 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69  ast the.** porti
9cc0: 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  on of the buffer
9cd0: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20   copied into by 
9ce0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
9cf0: 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65  /.static Expr *e
9d00: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
9d10: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
9d20: 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a   dupFlags, u8 **
9d30: 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70  pzBuffer){.  Exp
9d40: 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  r *pNew;        
9d50: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
9d60: 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a  eturn */.  u8 *z
9d70: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
9d80: 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65   /* Memory space
9d90: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62   from which to b
9da0: 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74  uild Expr object
9db0: 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63   */.  u32 static
9dc0: 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45  Flag;       /* E
9dd0: 50 5f 53 74 61 74 69 63 20 69 66 20 73 70 61 63  P_Static if spac
9de0: 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66  e not obtained f
9df0: 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  rom malloc */.. 
9e00: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
9e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ;.  assert( p );
9e20: 0a 20 20 61 73 73 65 72 74 28 20 64 75 70 46 6c  .  assert( dupFl
9e30: 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61  ags==0 || dupFla
9e40: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
9e50: 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CE );.  assert( 
9e60: 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64  pzBuffer==0 || d
9e70: 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  upFlags==EXPRDUP
9e80: 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a  _REDUCE );..  /*
9e90: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
9ea0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e  e to write the n
9eb0: 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72  ew Expr structur
9ec0: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75  e. */.  if( pzBu
9ed0: 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c  ffer ){.    zAll
9ee0: 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a  oc = *pzBuffer;.
9ef0: 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d      staticFlag =
9f00: 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65   EP_Static;.  }e
9f10: 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20  lse{.    zAlloc 
9f20: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
9f30: 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64  cRawNN(db, duped
9f40: 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46  ExprSize(p, dupF
9f50: 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74  lags));.    stat
9f60: 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a  icFlag = 0;.  }.
9f70: 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a    pNew = (Expr *
9f80: 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20  )zAlloc;..  if( 
9f90: 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53  pNew ){.    /* S
9fa0: 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74  et nNewSize to t
9fb0: 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65  he size allocate
9fc0: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
9fd0: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20  ure pointed to. 
9fe0: 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54     ** by pNew. T
9ff0: 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58  his is either EX
a000: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50  PR_FULLSIZE, EXP
a010: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
a020: 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b  .    ** EXPR_TOK
a030: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b  ENONLYSIZE. nTok
a040: 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  en is set to the
a050: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
a060: 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a   consumed.    **
a070: 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20   by the copy of 
a080: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
a090: 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e  string (if any).
a0a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  .    */.    cons
a0b0: 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75  t unsigned nStru
a0c0: 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78  ctSize = dupedEx
a0d0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
a0e0: 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63  dupFlags);.    c
a0f0: 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a  onst int nNewSiz
a100: 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20  e = nStructSize 
a110: 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74  & 0xfff;.    int
a120: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28   nToken;.    if(
a130: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
a140: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
a150: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
a160: 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e   ){.      nToken
a170: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a180: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
a190: 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  + 1;.    }else{.
a1a0: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30        nToken = 0
a1b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a1c0: 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  dupFlags ){.    
a1d0: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
a1e0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
a1f0: 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20  Reduced)==0 );. 
a200: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c       memcpy(zAll
a210: 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29  oc, p, nNewSize)
a220: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a230: 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28     u32 nSize = (
a240: 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53 69  u32)exprStructSi
a250: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ze(p);.      mem
a260: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
a270: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
a280: 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c   nSize<EXPR_FULL
a290: 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20  SIZE ){ .       
a2a0: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
a2b0: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
a2c0: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
a2d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
a2e0: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45      /* Set the E
a2f0: 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f  P_Reduced, EP_To
a300: 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f  kenOnly, and EP_
a310: 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70  Static flags app
a320: 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  ropriately. */. 
a330: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26     pNew->flags &
a340: 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45  = ~(EP_Reduced|E
a350: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53  P_TokenOnly|EP_S
a360: 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65  tatic|EP_MemToke
a370: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c  n);.    pNew->fl
a380: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
a390: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
a3a0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
a3b0: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
a3c0: 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a  |= staticFlag;..
a3d0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
a3e0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
a3f0: 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ng, if any. */. 
a400: 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b     if( nToken ){
a410: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f  .      char *zTo
a420: 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54  ken = pNew->u.zT
a430: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a  oken = (char*)&z
a440: 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b  Alloc[nNewSize];
a450: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54  .      memcpy(zT
a460: 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  oken, p->u.zToke
a470: 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  n, nToken);.    
a480: 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28  }..    if( 0==((
a490: 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66  p->flags|pNew->f
a4a0: 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65  lags) & (EP_Toke
a4b0: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20  nOnly|EP_Leaf)) 
a4c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  ){.      /* Fill
a4d0: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
a4e0: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
a4f0: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
a500: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78   */.      if( Ex
a510: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
a520: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
a530: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a540: 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  x.pSelect = sqli
a550: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
a560: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64   p->x.pSelect, d
a570: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
a590: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73  New->x.pList = s
a5a0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
a5b0: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  p(db, p->x.pList
a5c0: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a5d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
a5e0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
a5f0: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
a600: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
a610: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
a620: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
a630: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
a640: 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  y) ){.      zAll
a650: 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e  oc += dupedExprN
a660: 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  odeSize(p, dupFl
a670: 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
a680: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a690: 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f  (pNew, EP_TokenO
a6a0: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
a6b0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
a6c0: 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f  eft = p->pLeft ?
a6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a6e0: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a6f0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50  b, p->pLeft, EXP
a700: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
a710: 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20  lloc) : 0;.     
a720: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a730: 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20  = p->pRight ?.  
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c       exprDup(db,
a760: 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52   p->pRight, EXPR
a770: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
a780: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
a790: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75  }.      if( pzBu
a7a0: 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ffer ){.        
a7b0: 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c  *pzBuffer = zAll
a7c0: 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  oc;.      }.    
a7d0: 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53  }else{.#ifndef S
a7e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
a7f0: 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20  WFUNC.      if( 
a800: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a810: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  p, EP_Reduced|EP
a820: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
a830: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 57 69         pNew->pWi
a840: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  n = 0;.      }el
a850: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
a860: 2d 3e 70 57 69 6e 20 3d 20 73 71 6c 69 74 65 33  ->pWin = sqlite3
a870: 57 69 6e 64 6f 77 44 75 70 28 64 62 2c 20 70 4e  WindowDup(db, pN
a880: 65 77 2c 20 70 2d 3e 70 57 69 6e 29 3b 0a 20 20  ew, p->pWin);.  
a890: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
a8a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
a8b0: 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20 20 20 20  OWFUNC */.      
a8c0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
a8d0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
a8e0: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b  Only|EP_Leaf) ){
a8f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
a900: 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  w->op==TK_SELECT
a910: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
a920: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
a930: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
a940: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a950: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20  ->iColumn==0 || 
a960: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
a970: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
a980: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20  ( p->pRight==0  
a990: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d  || p->pRight==p-
a9a0: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
a9b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a9c0: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
a9d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a9e0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29  db, p->pLeft, 0)
a9f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
aa00: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
aa10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
aa20: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
aa30: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
aa40: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
aa50: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pNew;.}../*.** C
aa60: 72 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  reate and return
aa70: 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20   a deep copy of 
aa80: 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  the object passe
aa90: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
aaa0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66  .** argument. If
aab0: 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   an OOM conditio
aac0: 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  n is encountered
aad0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
aae0: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62  ed.** and the db
aaf0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
ab00: 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e  lag set..*/.#ifn
ab10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ab20: 43 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20  CTE.static With 
ab30: 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33  *withDup(sqlite3
ab40: 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a   *db, With *p){.
ab50: 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30    With *pRet = 0
ab60: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
ab70: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
ab80: 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66  eof(*p) + sizeof
ab90: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
aba0: 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65  nCte-1);.    pRe
abb0: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
abc0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
abd0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74  e);.    if( pRet
abe0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
abf0: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74  .      pRet->nCt
ac00: 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20  e = p->nCte;.   
ac10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
ac20: 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
ac30: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
ac40: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
ac50: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
ac60: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20  ->a[i].pSelect, 
ac70: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  0);.        pRet
ac80: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73  ->a[i].pCols = s
ac90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
aca0: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43  p(db, p->a[i].pC
acb0: 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ols, 0);.       
acc0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d   pRet->a[i].zNam
acd0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
ace0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
acf0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
ad00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
ad10: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65  rn pRet;.}.#else
ad20: 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75  .# define withDu
ad30: 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a  p(x,y) 0.#endif.
ad40: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
ad50: 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f  wing group of ro
ad60: 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70  utines make deep
ad70: 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65   copies of expre
ad80: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65  ssions,.** expre
ad90: 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20  ssion lists, ID 
ada0: 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63  lists, and selec
adb0: 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54  t statements.  T
adc0: 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a  he copies can.**
add0: 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20   be deleted (by 
ade0: 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20  being passed to 
adf0: 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65  their respective
ae00: 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75   ...Delete() rou
ae10: 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75  tines).** withou
ae20: 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20  t effecting the 
ae30: 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a  originals..**.**
ae40: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
ae50: 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f  list, ID, and so
ae60: 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72  urce lists retur
ae70: 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  n by sqlite3Expr
ae80: 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71  ListDup(),.** sq
ae90: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29  lite3IdListDup()
aea0: 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63  , and sqlite3Src
aeb0: 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f  ListDup() can no
aec0: 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70  t be further exp
aed0: 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62  anded .** by sub
aee0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
aef0: 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65   sqlite*ListAppe
af00: 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  nd() routines..*
af10: 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20  *.** Any tables 
af20: 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74  that the SrcList
af30: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
af40: 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74  are not duplicat
af50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
af60: 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ags parameter co
af70: 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61  ntains a combina
af80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52  tion of the EXPR
af90: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
afa0: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
afb0: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
afc0: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74  set, then the st
afd0: 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
afe0: 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74   is a.** truncat
aff0: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
b000: 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72  e usual Expr str
b010: 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
b020: 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a   be stored as.**
b030: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d   part of the in-
b040: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
b050: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
b060: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f  abase schema..*/
b070: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
b080: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
b090: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
b0a0: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
b0b0: 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
b0c0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
b0d0: 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UCE );.  return 
b0e0: 70 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20  p ? exprDup(db, 
b0f0: 70 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30  p, flags, 0) : 0
b100: 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  ;.}.ExprList *sq
b110: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
b120: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
b130: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  prList *p, int f
b140: 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73  lags){.  ExprLis
b150: 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63  t *pNew;.  struc
b160: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
b170: 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65  *pItem, *pOldIte
b180: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  m;.  int i;.  Ex
b190: 70 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74  pr *pPriorSelect
b1a0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  Col = 0;.  asser
b1b0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
b1c0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
b1d0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
b1e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b1f0: 28 64 62 2c 20 73 71 6c 69 74 65 33 44 62 4d 61  (db, sqlite3DbMa
b200: 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 29 29  llocSize(db, p))
b210: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
b220: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
b230: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e  ew->nExpr = p->n
b240: 45 78 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d 20  Expr;.  pItem = 
b250: 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49  pNew->a;.  pOldI
b260: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
b270: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
b280: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
b290: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
b2a0: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
b2b0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
b2c0: 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e  pr;.    Expr *pN
b2d0: 65 77 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65  ewExpr;.    pIte
b2e0: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
b2f0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
b300: 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a  ldExpr, flags);.
b310: 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72      if( pOldExpr
b320: 20 0a 20 20 20 20 20 26 26 20 70 4f 6c 64 45 78   .     && pOldEx
b330: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
b340: 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26  T_COLUMN.     &&
b350: 20 28 70 4e 65 77 45 78 70 72 20 3d 20 70 49 74   (pNewExpr = pIt
b360: 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a 20  em->pExpr)!=0 . 
b370: 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
b380: 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43  rt( pNewExpr->iC
b390: 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20  olumn==0 || i>0 
b3a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
b3b0: 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  wExpr->iColumn==
b3c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
b3d0: 65 72 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e 70  ert( pOldExpr->p
b3e0: 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e  Left==pOldExpr->
b3f0: 70 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20  pRight );.      
b400: 20 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f    pPriorSelectCo
b410: 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c  l = pNewExpr->pL
b420: 65 66 74 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e  eft = pNewExpr->
b430: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 65  pRight;.      }e
b440: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
b450: 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
b460: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
b470: 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20 29  m[-1].pExpr!=0 )
b480: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b490: 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c  ( pNewExpr->iCol
b4a0: 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70  umn==pItem[-1].p
b4b0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20  Expr->iColumn+1 
b4c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b4d0: 74 28 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43  t( pPriorSelectC
b4e0: 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45  ol==pItem[-1].pE
b4f0: 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  xpr->pLeft );.  
b500: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 2d 3e        pNewExpr->
b510: 70 4c 65 66 74 20 3d 20 70 50 72 69 6f 72 53 65  pLeft = pPriorSe
b520: 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20 7d  lectCol;.      }
b530: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 6d  .    }.    pItem
b540: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
b550: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b560: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
b570: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
b580: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b590: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b5a0: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
b5b0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
b5c0: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
b5d0: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
b5e0: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49  done = 0;.    pI
b5f0: 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20  tem->bSpanIsTab 
b600: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61  = pOldItem->bSpa
b610: 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65  nIsTab;.    pIte
b620: 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 3d 20  m->bSorterRef = 
b630: 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 6f 72 74 65  pOldItem->bSorte
b640: 72 52 65 66 3b 0a 20 20 20 20 70 49 74 65 6d 2d  rRef;.    pItem-
b650: 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75  >u = pOldItem->u
b660: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b670: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  New;.}../*.** If
b680: 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65   cursors, trigge
b690: 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75  rs, views and su
b6a0: 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c  bqueries are all
b6b0: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a   omitted from.**
b6c0: 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e   the build, then
b6d0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   none of the fol
b6e0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c  lowing routines,
b6f0: 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20   except for .** 
b700: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
b710: 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  (), can be calle
b720: 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  d. sqlite3Select
b730: 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d  Dup() is sometim
b740: 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74  es.** called wit
b750: 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  h a NULL argumen
b760: 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  t..*/.#if !defin
b770: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
b780: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
b790: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
b7a0: 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66  GGER) \. || !def
b7b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b7c0: 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69  _SUBQUERY).SrcLi
b7d0: 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
b7e0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
b7f0: 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69  b, SrcList *p, i
b800: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63  nt flags){.  Src
b810: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
b820: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  t i;.  int nByte
b830: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
b840: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
b850: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42  ) return 0;.  nB
b860: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
b870: 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20   + (p->nSrc>0 ? 
b880: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
b890: 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20  * (p->nSrc-1) : 
b8a0: 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  0);.  pNew = sql
b8b0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b8c0: 4e 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  N(db, nByte );. 
b8d0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
b8e0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
b8f0: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
b900: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
b910: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
b920: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
b930: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
b940: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
b950: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
b960: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
b970: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
b980: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
b990: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
b9a0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pNewItem->pSchem
b9b0: 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  a = pOldItem->pS
b9c0: 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49  chema;.    pNewI
b9d0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
b9e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
b9f0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
ba00: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
ba10: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
ba20: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
ba30: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
ba40: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
ba50: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
ba60: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
ba70: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  , pOldItem->zAli
ba80: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
ba90: 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d  m->fg = pOldItem
baa0: 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74  ->fg;.    pNewIt
bab0: 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f  em->iCursor = pO
bac0: 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ldItem->iCursor;
bad0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61  .    pNewItem->a
bae0: 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c  ddrFillSub = pOl
baf0: 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  dItem->addrFillS
bb00: 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ub;.    pNewItem
bb10: 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f  ->regReturn = pO
bb20: 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  ldItem->regRetur
bb30: 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49  n;.    if( pNewI
bb40: 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
bb50: 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  dBy ){.      pNe
bb60: 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  wItem->u1.zIndex
bb70: 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62  edBy = sqlite3Db
bb80: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
bb90: 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
bba0: 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  By);.    }.    p
bbb0: 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65  NewItem->pIBInde
bbc0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49  x = pOldItem->pI
bbd0: 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  BIndex;.    if( 
bbe0: 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54  pNewItem->fg.isT
bbf0: 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  abFunc ){.      
bc00: 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75  pNewItem->u1.pFu
bc10: 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20  ncArg = .       
bc20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
bc30: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
bc40: 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c  em->u1.pFuncArg,
bc50: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20   flags);.    }. 
bc60: 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74     pTab = pNewIt
bc70: 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49  em->pTab = pOldI
bc80: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
bc90: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20  f( pTab ){.     
bca0: 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b   pTab->nTabRef++
bcb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
bcc0: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Item->pSelect = 
bcd0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
bce0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
bcf0: 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a  Select, flags);.
bd00: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f      pNewItem->pO
bd10: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
bd20: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
bd30: 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20  >pOn, flags);.  
bd40: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69    pNewItem->pUsi
bd50: 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ng = sqlite3IdLi
bd60: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
bd70: 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20  em->pUsing);.   
bd80: 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73   pNewItem->colUs
bd90: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63  ed = pOldItem->c
bda0: 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65  olUsed;.  }.  re
bdb0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
bdc0: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
bdd0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
bde0: 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  b, IdList *p){. 
bdf0: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
be00: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
be10: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
be20: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
be30: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
be40: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
be50: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
be60: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
be70: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
be80: 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e   pNew->nId = p->
be90: 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  nId;.  pNew->a =
bea0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
beb0: 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64  RawNN(db, p->nId
bec0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
bed0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
bee0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
bef0: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
bf00: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
bf10: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f  n 0;.  }.  /* No
bf20: 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  te that because 
bf30: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
bf40: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
bf50: 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a  ->a[] is not.  *
bf60: 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20  * necessarily a 
bf70: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71  power of two, sq
bf80: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
bf90: 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  d() may not be c
bfa0: 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  alled.  ** on th
bfb0: 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61  e duplicate crea
bfc0: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
bfd0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
bfe0: 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b  =0; i<p->nId; i+
bff0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49  +){.    struct I
c000: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  dList_item *pNew
c010: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
c020: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  i];.    struct I
c030: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  dList_item *pOld
c040: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
c050: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
c060: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
c070: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
c080: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
c090: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
c0a0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
c0b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
c0c0: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
c0d0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
c0e0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
c0f0: 74 20 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c 61  t *pDup, int fla
c100: 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  gs){.  Select *p
c110: 52 65 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63  Ret = 0;.  Selec
c120: 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t *pNext = 0;.  
c130: 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26 70  Select **pp = &p
c140: 52 65 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  Ret;.  Select *p
c150: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
c160: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44  =0 );.  for(p=pD
c170: 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69  up; p; p=p->pPri
c180: 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  or){.    Select 
c190: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  *pNew = sqlite3D
c1a0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c1b0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
c1c0: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
c1d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77   break;.    pNew
c1e0: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
c1f0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
c200: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61  , p->pEList, fla
c210: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c220: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
c230: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
c240: 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Src, flags);.   
c250: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
c260: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
c270: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c  b, p->pWhere, fl
c280: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c290: 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
c2a0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
c2b0: 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66  , p->pGroupBy, f
c2c0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lags);.    pNew-
c2d0: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
c2e0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
c2f0: 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29  >pHaving, flags)
c300: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64  ;.    pNew->pOrd
c310: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
c320: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
c330: 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73  >pOrderBy, flags
c340: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  );.    pNew->op 
c350: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65  = p->op;.    pNe
c360: 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74  w->pNext = pNext
c370: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69  ;.    pNew->pPri
c380: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  or = 0;.    pNew
c390: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
c3a0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
c3b0: 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b  >pLimit, flags);
c3c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  .    pNew->iLimi
c3d0: 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  t = 0;.    pNew-
c3e0: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >iOffset = 0;.  
c3f0: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
c400: 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26   = p->selFlags &
c410: 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72   ~SF_UsesEphemer
c420: 61 6c 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  al;.    pNew->ad
c430: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
c440: 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  -1;.    pNew->ad
c450: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
c460: 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53  -1;.    pNew->nS
c470: 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53  electRow = p->nS
c480: 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e  electRow;.    pN
c490: 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68  ew->pWith = with
c4a0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  Dup(db, p->pWith
c4b0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
c4c0: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
c4d0: 43 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e  C.    pNew->pWin
c4e0: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
c4f0: 70 57 69 6e 44 65 66 6e 20 3d 20 73 71 6c 69 74  pWinDefn = sqlit
c500: 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 75 70 28  e3WindowListDup(
c510: 64 62 2c 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29  db, p->pWinDefn)
c520: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65  ;.#endif.    pNe
c530: 77 2d 3e 73 65 6c 49 64 20 3d 20 70 2d 3e 73 65  w->selId = p->se
c540: 6c 49 64 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70  lId;.    *pp = p
c550: 4e 65 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70  New;.    pp = &p
c560: 4e 65 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  New->pPrior;.   
c570: 20 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20   pNext = pNew;. 
c580: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65   }..  return pRe
c590: 74 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  t;.}.#else.Selec
c5a0: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
c5b0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
c5c0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
c5d0: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
c5e0: 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p==0 );.  retu
c5f0: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
c600: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
c610: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
c620: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
c630: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
c640: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
c650: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
c660: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
c670: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
c680: 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74 20 61 72  .** The pList ar
c690: 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65  gument must be e
c6a0: 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20  ither NULL or a 
c6b0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 45 78  pointer to an Ex
c6c0: 70 72 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69 6e  prList.** obtain
c6d0: 65 64 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  ed from a prior 
c6e0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45  call to sqlite3E
c6f0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 2e  xprListAppend().
c700: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
c710: 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65  * may not be use
c720: 64 20 77 69 74 68 20 61 6e 20 45 78 70 72 4c 69  d with an ExprLi
c730: 73 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  st obtained from
c740: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c750: 44 75 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f 6e  Dup()..** Reason
c760: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
c770: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
c780: 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   number of slots
c790: 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a 2a   in pList->a[].*
c7a0: 2a 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20  * is a power of 
c7b0: 74 77 6f 2e 20 20 54 68 61 74 20 69 73 20 74 72  two.  That is tr
c7c0: 75 65 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78  ue for sqlite3Ex
c7d0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  prListAppend() r
c7e0: 65 74 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69 73  eturns.** but is
c7f0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
c800: 20 74 72 75 65 20 66 72 6f 6d 20 74 68 65 20 72   true from the r
c810: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
c820: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
c830: 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  p()..**.** If a 
c840: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
c850: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
c860: 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20  the entire list 
c870: 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20  is freed and.** 
c880: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
c890: 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  .  If non-NULL i
c8a0: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
c8b0: 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
c8c0: 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65  d.** that the ne
c8d0: 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63  w entry was succ
c8e0: 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65  essfully appende
c8f0: 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  d..*/.ExprList *
c900: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
c910: 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a  ppend(.  Parse *
c920: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
c930: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
c940: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
c950: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
c960: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
c970: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
c980: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
c990: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
c9a0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
c9b0: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
c9c0: 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  nded. Might be N
c9d0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ULL */.){.  stru
c9e0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
c9f0: 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
ca00: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
ca10: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
ca20: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
ca30: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
ca40: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
ca50: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
ca60: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
ca70: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
ca80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
ca90: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
caa0: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
cab0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
cac0: 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ( (pList->nExpr 
cad0: 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  & (pList->nExpr-
cae0: 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78  1))==0 ){.    Ex
caf0: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
cb00: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
cb10: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
cb20: 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ist, .          
cb30: 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
cb40: 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e 45 78 70  )+(2*pList->nExp
cb50: 72 20 2d 20 31 29 2a 73 69 7a 65 6f 66 28 70 4c  r - 1)*sizeof(pL
cb60: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
cb70: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
cb80: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
cb90: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
cba0: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
cbb0: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
cbc0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
cbd0: 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66  +];.  assert( of
cbe0: 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78  fsetof(struct Ex
cbf0: 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d  prList_item,zNam
cc00: 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49 74 65 6d  e)==sizeof(pItem
cc10: 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20 20 61 73  ->pExpr) );.  as
cc20: 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73  sert( offsetof(s
cc30: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
cc40: 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30 20 29 3b  tem,pExpr)==0 );
cc50: 0a 20 20 6d 65 6d 73 65 74 28 26 70 49 74 65 6d  .  memset(&pItem
cc60: 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f 66  ->zName,0,sizeof
cc70: 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73 65 74 6f  (*pItem)-offseto
cc80: 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73  f(struct ExprLis
cc90: 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b 0a  t_item,zName));.
cca0: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
ccb0: 20 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e   pExpr;.  return
ccc0: 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a   pList;..no_mem:
ccd0: 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64       .  /* Avoid
cce0: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
ccf0: 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61  if malloc has fa
cd00: 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  iled. */.  sqlit
cd10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
cd20: 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74   pExpr);.  sqlit
cd30: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
cd40: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72  (db, pList);.  r
cd50: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
cd60: 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70  * pColumns and p
cd70: 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74  Expr form a vect
cd80: 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68  or assignment wh
cd90: 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 20 74  ich is part of t
cda0: 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65  he SET.** clause
cdb0: 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73 74   of an UPDATE st
cdc0: 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74  atement.  Like t
cdd0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
cde0: 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70    (a,b,c) = (exp
cdf0: 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a  r1,expr2,expr3).
ce00: 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63  ** Or:    (a,b,c
ce10: 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c  ) = (SELECT x,y,
ce20: 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a  z FROM ....).**.
ce30: 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d  ** For each term
ce40: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20 61   of the vector a
ce50: 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e  ssignment, appen
ce60: 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f  d new entries to
ce70: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
ce80: 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20  on list pList.  
ce90: 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61  In the case of a
cea0: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
ceb0: 20 52 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20   RHS, append.** 
cec0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
ced0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f   expressions..*/
cee0: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
cef0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
cf00: 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20  Vector(.  Parse 
cf10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
cf20: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
cf30: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
cf40: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
cf50: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
cf60: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
cf70: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49  t be NULL */.  I
cf80: 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c  dList *pColumns,
cf90: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
cfa0: 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66   names of LHS of
cfb0: 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20   the assignment 
cfc0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
cfe0: 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
cff0: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e   to be appended.
d000: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
d010: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d020: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d030: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
d040: 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20  i;.  int iFirst 
d050: 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
d060: 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a  >nExpr : 0;.  /*
d070: 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e   pColumns can on
d080: 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74  ly be NULL due t
d090: 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20  o an OOM but an 
d0a0: 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 61  OOM will cause a
d0b0: 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72 69 6f  n.  ** exit prio
d0c0: 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
d0d0: 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20  e being invoked 
d0e0: 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
d0f0: 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f  Columns==0) ) go
d100: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
d110: 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45  _error;.  if( pE
d120: 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65  xpr==0 ) goto ve
d130: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
d140: 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  r;..  /* If the 
d150: 52 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 2c  RHS is a vector,
d160: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69 6d 6d   then we can imm
d170: 65 64 69 61 74 65 6c 79 20 63 68 65 63 6b 20 74  ediately check t
d180: 6f 20 73 65 65 20 74 68 61 74 20 0a 20 20 2a 2a  o see that .  **
d190: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d1a0: 20 52 48 53 20 61 6e 64 20 4c 48 53 20 6d 61 74   RHS and LHS mat
d1b0: 63 68 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  ch.  But if the 
d1c0: 52 48 53 20 69 73 20 61 20 53 45 4c 45 43 54 2c  RHS is a SELECT,
d1d0: 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 73   .  ** wildcards
d1e0: 20 28 22 2a 22 29 20 69 6e 20 74 68 65 20 72 65   ("*") in the re
d1f0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
d200: 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 65  SELECT must be e
d210: 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 20  xpanded before. 
d220: 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20 74 68   ** we can do th
d230: 65 20 73 69 7a 65 20 63 68 65 63 6b 2c 20 73 6f  e size check, so
d240: 20 64 65 66 65 72 20 74 68 65 20 73 69 7a 65 20   defer the size 
d250: 63 68 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64 65  check until code
d260: 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 2a   generation..  *
d270: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
d280: 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p!=TK_SELECT && 
d290: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 28  pColumns->nId!=(
d2a0: 6e 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  n=sqlite3ExprVec
d2b0: 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 29 20  torSize(pExpr)) 
d2c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d2d0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d2e0: 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67  %d columns assig
d2f0: 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a  ned %d values",.
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49      pColumns->nI
d320: 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  d, n);.    goto 
d330: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
d340: 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  ror;.  }..  for(
d350: 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73 2d  i=0; i<pColumns-
d360: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
d370: 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d  Expr *pSubExpr =
d380: 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56   sqlite3ExprForV
d390: 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73  ectorField(pPars
d3a0: 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20  e, pExpr, i);.  
d3b0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
d3c0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
d3d0: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70  pParse, pList, p
d3e0: 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66  SubExpr);.    if
d3f0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
d400: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
d410: 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b  nExpr==iFirst+i+
d420: 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  1 );.      pList
d430: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
d440: 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c  -1].zName = pCol
d450: 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  umns->a[i].zName
d460: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73  ;.      pColumns
d470: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30  ->a[i].zName = 0
d480: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
d490: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
d4a0: 69 6c 65 64 20 26 26 20 70 45 78 70 72 2d 3e 6f  iled && pExpr->o
d4b0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p==TK_SELECT && 
d4c0: 41 4c 57 41 59 53 28 70 4c 69 73 74 21 3d 30 29  ALWAYS(pList!=0)
d4d0: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 46   ){.    Expr *pF
d4e0: 69 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  irst = pList->a[
d4f0: 69 46 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20  iFirst].pExpr;. 
d500: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73     assert( pFirs
d510: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
d520: 72 74 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d  rt( pFirst->op==
d530: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
d540: 20 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a   );.     .    /*
d550: 20 53 74 6f 72 65 20 74 68 65 20 53 45 4c 45 43   Store the SELEC
d560: 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 70  T statement in p
d570: 52 69 67 68 74 20 73 6f 20 69 74 20 77 69 6c 6c  Right so it will
d580: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e   be deleted when
d590: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
d5a0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 29 20  xprListDelete() 
d5b0: 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20  is called */.   
d5c0: 20 70 46 69 72 73 74 2d 3e 70 52 69 67 68 74 20   pFirst->pRight 
d5d0: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70 45 78  = pExpr;.    pEx
d5e0: 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  pr = 0;..    /* 
d5f0: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a  Remember the siz
d600: 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20  e of the LHS in 
d610: 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77  iTable so that w
d620: 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74  e can check that
d630: 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20  .    ** the RHS 
d640: 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20 6d 61  and LHS sizes ma
d650: 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64 65 20  tch during code 
d660: 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20  generation. */. 
d670: 20 20 20 70 46 69 72 73 74 2d 3e 69 54 61 62 6c     pFirst->iTabl
d680: 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49  e = pColumns->nI
d690: 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61  d;.  }..vector_a
d6a0: 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73  ppend_error:.  s
d6b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
d6c0: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73  (db, pExpr);.  s
d6d0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
d6e0: 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29  te(db, pColumns)
d6f0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
d700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
d710: 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f  he sort order fo
d720: 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  r the last eleme
d730: 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  nt on the given 
d740: 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ExprList..*/.voi
d750: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
d760: 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78  tSetSortOrder(Ex
d770: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69  prList *p, int i
d780: 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66  SortOrder){.  if
d790: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
d7a0: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
d7b0: 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30  E_SO_UNDEFINED<0
d7c0: 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53   && SQLITE_SO_AS
d7d0: 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53  C>=0 && SQLITE_S
d7e0: 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73  O_DESC>0 );.  as
d7f0: 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30  sert( p->nExpr>0
d800: 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f   );.  if( iSortO
d810: 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73  rder<0 ){.    as
d820: 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45  sert( p->a[p->nE
d830: 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72  xpr-1].sortOrder
d840: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  ==SQLITE_SO_ASC 
d850: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
d860: 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78   }.  p->a[p->nEx
d870: 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20  pr-1].sortOrder 
d880: 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72  = (u8)iSortOrder
d890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
d8a0: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
d8b0: 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66  zName element of
d8c0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
d8d0: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
d8e0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
d8f0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
d900: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
d910: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
d920: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
d930: 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76  pName should nev
d940: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
d950: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
d960: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
d970: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
d980: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
d990: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
d9a0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
d9b0: 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72  stSetName(.  Par
d9c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d9d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
d9e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
d9f0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
da00: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
da10: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
da20: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   span. */.  Toke
da30: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
da40: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62      /* Name to b
da50: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
da60: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
da70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
da80: 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74  cause the name t
da90: 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f  o be dequoted */
daa0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  .){.  assert( pL
dab0: 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ist!=0 || pParse
dac0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
dad0: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
dae0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
daf0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
db00: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
db10: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
db20: 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  r>0 );.    pItem
db30: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
db40: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
db50: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
db60: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20  >zName==0 );.   
db70: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
db80: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
db90: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
dba0: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
dbb0: 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74  ;.    if( dequot
dbc0: 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f  e ) sqlite3Dequo
dbd0: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
dbe0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
dbf0: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
dc00: 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e  a[].zSpan elemen
dc10: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
dc20: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
dc30: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
dc40: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
dc50: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
dc60: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
dc70: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
dc80: 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64  But pSpan should
dc90: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
dca0: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
dcb0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
dcc0: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
dcd0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
dce0: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
dcf0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
dd00: 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20  prListSetSpan(. 
dd10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
dd20: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
dd30: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
dd40: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
dd50: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
dd60: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
dd70: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
dd80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
dd90: 72 74 2c 20 20 20 20 20 2f 2a 20 53 74 61 72 74  rt,     /* Start
dda0: 20 6f 66 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a   of the span */.
ddb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
ddc0: 6e 64 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64  nd        /* End
ddd0: 20 6f 66 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a   of the span */.
dde0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
ddf0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
de00: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
de10: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
de20: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
de30: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
de40: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
de50: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
de60: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
de70: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
de80: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
de90: 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >0 );.    sqlite
dea0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
deb0: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
dec0: 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71  Item->zSpan = sq
ded0: 6c 69 74 65 33 44 62 53 70 61 6e 44 75 70 28 64  lite3DbSpanDup(d
dee0: 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29  b, zStart, zEnd)
def0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
df00: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
df10: 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e   list pEList con
df20: 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  tains more than 
df30: 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c  iLimit elements,
df40: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
df50: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
df60: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
df70: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
df80: 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73  ckLength(.  Pars
df90: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70  e *pParse,.  Exp
dfa0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20  rList *pEList,. 
dfb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62   const char *zOb
dfc0: 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78  ject.){.  int mx
dfd0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
dfe0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
dff0: 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65  IT_COLUMN];.  te
e000: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
e010: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
e020: 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73  =mx );.  testcas
e030: 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  e( pEList && pEL
e040: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31  ist->nExpr==mx+1
e050: 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
e060: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
e070: 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  r>mx ){.    sqli
e080: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
e090: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
e0a0: 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f  lumns in %s", zO
e0b0: 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bject);.  }.}../
e0c0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
e0d0: 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e  ntire expression
e0e0: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
e0f0: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
e100: 20 76 6f 69 64 20 65 78 70 72 4c 69 73 74 44 65   void exprListDe
e110: 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a  leteNN(sqlite3 *
e120: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
e130: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ist){.  int i = 
e140: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
e150: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
e160: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 20 70  item *pItem =  p
e170: 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73 73 65 72  List->a;.  asser
e180: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
e190: 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73  0 );.  do{.    s
e1a0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
e1b0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  (db, pItem->pExp
e1c0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  r);.    sqlite3D
e1d0: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
e1e0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
e1f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
e200: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
e210: 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68    pItem++;.  }wh
e220: 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b 0a 20 20  ile( --i>0 );.  
e230: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
e240: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f  db, pList);.}.vo
e250: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
e260: 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
e270: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
e280: 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c  pList){.  if( pL
e290: 69 73 74 20 29 20 65 78 70 72 4c 69 73 74 44 65  ist ) exprListDe
e2a0: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74  leteNN(db, pList
e2b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
e2c0: 72 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f  rn the bitwise-O
e2d0: 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c  R of all Expr.fl
e2e0: 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68  ags fields in th
e2f0: 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c  e given.** ExprL
e300: 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  ist..*/.u32 sqli
e310: 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
e320: 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20  (const ExprList 
e330: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
e340: 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20  ;.  u32 m = 0;. 
e350: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
e360: 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
e370: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
e380: 69 2b 2b 29 7b 0a 20 20 20 20 20 45 78 70 72 20  i++){.     Expr 
e390: 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
e3a0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
e3b0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d   assert( pExpr!=
e3c0: 30 20 29 3b 0a 20 20 20 20 20 6d 20 7c 3d 20 70  0 );.     m |= p
e3d0: 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d  Expr->flags;.  }
e3e0: 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a  .  return m;.}..
e3f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
e400: 53 45 4c 45 43 54 2d 6e 6f 64 65 20 63 61 6c 6c  SELECT-node call
e410: 62 61 63 6b 20 66 6f 72 20 74 68 65 20 65 78 70  back for the exp
e420: 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72 20 74  ression walker t
e430: 68 61 74 0a 2a 2a 20 61 6c 77 61 79 73 20 22 66  hat.** always "f
e440: 61 69 6c 73 22 2e 20 20 42 79 20 22 66 61 69 6c  ails".  By "fail
e450: 22 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20  " in this case, 
e460: 77 65 20 6d 65 61 6e 20 73 65 74 0a 2a 2a 20 70  we mean set.** p
e470: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f  Walker->eCode to
e480: 20 7a 65 72 6f 20 61 6e 64 20 61 62 6f 72 74 2e   zero and abort.
e490: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
e4a0: 62 61 63 6b 20 69 73 20 75 73 65 64 20 62 79 20  back is used by 
e4b0: 6d 75 6c 74 69 70 6c 65 20 65 78 70 72 65 73 73  multiple express
e4c0: 69 6f 6e 20 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a  ion walkers..*/.
e4d0: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
e4e0: 74 57 61 6c 6b 46 61 69 6c 28 57 61 6c 6b 65 72  tWalkFail(Walker
e4f0: 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
e500: 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  t *NotUsed){.  U
e510: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
e520: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c  NotUsed);.  pWal
e530: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
e540: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e550: 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rt;.}../*.** If 
e560: 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73  the input expres
e570: 73 69 6f 6e 20 69 73 20 61 6e 20 49 44 20 77 69  sion is an ID wi
e580: 74 68 20 74 68 65 20 6e 61 6d 65 20 22 74 72 75  th the name "tru
e590: 65 22 20 6f 72 20 22 66 61 6c 73 65 22 0a 2a 2a  e" or "false".**
e5a0: 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 69 74   then convert it
e5b0: 20 69 6e 74 6f 20 61 6e 20 54 4b 5f 54 52 55 45   into an TK_TRUE
e5c0: 46 41 4c 53 45 20 74 65 72 6d 2e 20 20 52 65 74  FALSE term.  Ret
e5d0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a  urn non-zero if.
e5e0: 2a 2a 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  ** the conversio
e5f0: 6e 20 68 61 70 70 65 6e 65 64 2c 20 61 6e 64 20  n happened, and 
e600: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
e610: 65 73 73 69 6f 6e 20 69 73 20 75 6e 61 6c 74 65  ession is unalte
e620: 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
e630: 74 65 33 45 78 70 72 49 64 54 6f 54 72 75 65 46  te3ExprIdToTrueF
e640: 61 6c 73 65 28 45 78 70 72 20 2a 70 45 78 70 72  alse(Expr *pExpr
e650: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ){.  assert( pEx
e660: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c  pr->op==TK_ID ||
e670: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
e680: 54 52 49 4e 47 20 29 3b 0a 20 20 69 66 28 20 73  TRING );.  if( s
e690: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
e6a0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22  xpr->u.zToken, "
e6b0: 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 7c 7c 20  true")==0.   || 
e6c0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
e6d0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
e6e0: 22 66 61 6c 73 65 22 29 3d 3d 30 0a 20 20 29 7b  "false")==0.  ){
e6f0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
e700: 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3b 0a 20   TK_TRUEFALSE;. 
e710: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
e720: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e730: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
e740: 6e 74 20 6d 75 73 74 20 62 65 20 61 20 54 4b 5f  nt must be a TK_
e750: 54 52 55 45 46 41 4c 53 45 20 45 78 70 72 20 6e  TRUEFALSE Expr n
e760: 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ode.  Return 1 i
e770: 66 20 69 74 20 69 73 20 54 52 55 45 0a 2a 2a 20  f it is TRUE.** 
e780: 61 6e 64 20 30 20 69 66 20 69 74 20 69 73 20 46  and 0 if it is F
e790: 41 4c 53 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ALSE..*/.int sql
e7a0: 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c  ite3ExprTruthVal
e7b0: 75 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ue(const Expr *p
e7c0: 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28  Expr){.  assert(
e7d0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 54   pExpr->op==TK_T
e7e0: 52 55 45 46 41 4c 53 45 20 29 3b 0a 20 20 61 73  RUEFALSE );.  as
e7f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72  sert( sqlite3Str
e800: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
e810: 6f 6b 65 6e 2c 22 74 72 75 65 22 29 3d 3d 30 0a  oken,"true")==0.
e820: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
e830: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
e840: 75 2e 7a 54 6f 6b 65 6e 2c 22 66 61 6c 73 65 22  u.zToken,"false"
e850: 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
e860: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
e870: 5b 34 5d 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  [4]==0;.}.../*.*
e880: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
e890: 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c   are Walker call
e8a0: 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63 68  backs used to ch
e8b0: 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73 20  eck expressions 
e8c0: 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68 65  to.** see if the
e8d0: 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74 22  y are "constant"
e8e0: 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e 69   for some defini
e8f0: 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74  tion of constant
e900: 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72  .  The.** Walker
e910: 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65 74  .eCode value det
e920: 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65  ermines the type
e930: 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20 77   of "constant" w
e940: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  e are looking.**
e950: 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73   for..**.** Thes
e960: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
e970: 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
e980: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f  implement the fo
e990: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
e9a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
e9b0: 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20  Constant()      
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
e9d0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a  ker->eCode==1.**
e9e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e9f0: 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
ea00: 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70 57  n()           pW
ea10: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a  alker->eCode==2.
ea20: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
ea30: 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
ea40: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
ea50: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
ea60: 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  3.**     sqlite3
ea70: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
ea80: 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20 20  Function()      
ea90: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
eaa0: 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49  ==4 or 5.**.** I
eab0: 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68 65  n all cases, the
eac0: 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20 57   callbacks set W
ead0: 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e  alker.eCode=0 an
eae0: 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20 65  d abort if the e
eaf0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
eb00: 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20  found to not be 
eb10: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a  a constant..**.*
eb20: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78 70  * The sqlite3Exp
eb30: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
eb40: 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64 20  ction() is used 
eb50: 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 65  for evaluating e
eb60: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e  xpressions.** in
eb70: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
eb80: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
eb90: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c  Walker.eCode val
eba0: 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61 72  ue is 5 when par
ebb0: 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74  sing.** an exist
ebc0: 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20 34  ing schema and 4
ebd0: 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   when processing
ebe0: 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74   a new statement
ebf0: 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61  .  A bound.** pa
ec00: 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20 61  rameter raises a
ec10: 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77 20  n error for new 
ec20: 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74 20  statements, but 
ec30: 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76  is silently conv
ec40: 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c  erted.** to NULL
ec50: 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73 63   for existing sc
ec60: 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c 6c  hemas.  This all
ec70: 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ows sqlite_maste
ec80: 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a 2a  r tables that .*
ec90: 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e  * contain a boun
eca0: 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63 61  d parameter beca
ecb0: 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67 65  use they were ge
ecc0: 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65 72  nerated by older
ecd0: 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
ece0: 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61 72  SQLite to be par
ecf0: 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72  sed by newer ver
ed00: 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
ed10: 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67 20  without raising 
ed20: 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73  a.** malformed s
ed30: 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a  chema error..*/.
ed40: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e  static int exprN
ed50: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61  odeIsConstant(Wa
ed60: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
ed70: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20  xpr *pExpr){..  
ed80: 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65  /* If pWalker->e
ed90: 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20 61  Code is 2 then a
eda0: 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65  ny term of the e
edb0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
edc0: 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  omes from.  ** t
edd0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
ede0: 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66 74  lauses of a left
edf0: 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69   join disqualifi
ee00: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
ee10: 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e  n.  ** from bein
ee20: 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e  g considered con
ee30: 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20  stant. */.  if( 
ee40: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
ee50: 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  2 && ExprHasProp
ee60: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
ee70: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
ee80: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
ee90: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   0;.    return W
eea0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
eeb0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
eec0: 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e  op ){.    /* Con
eed0: 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  sider functions 
eee0: 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69  to be constant i
eef0: 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75  f all their argu
ef00: 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61  ments are consta
ef10: 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 69  nt.    ** and ei
ef20: 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43  ther pWalker->eC
ef30: 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74  ode==4 or 5 or t
ef40: 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  he function has 
ef50: 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  the.    ** SQLIT
ef60: 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61  E_FUNC_CONST fla
ef70: 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  g. */.    case T
ef80: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
ef90: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65    if( pWalker->e
efa0: 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48  Code>=4 || ExprH
efb0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
efc0: 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29  ,EP_ConstFunc) )
efd0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
efe0: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
eff0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f000: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
f010: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
f020: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
f030: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61  ;.      }.    ca
f040: 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 20 20  se TK_ID:.      
f050: 2f 2a 20 43 6f 6e 76 65 72 74 20 22 74 72 75 65  /* Convert "true
f060: 22 20 6f 72 20 22 66 61 6c 73 65 22 20 69 6e 20  " or "false" in 
f070: 61 20 44 45 46 41 55 4c 54 20 63 6c 61 75 73 65  a DEFAULT clause
f080: 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
f090: 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 54  ** appropriate T
f0a0: 4b 5f 54 52 55 45 46 41 4c 53 45 20 6f 70 65 72  K_TRUEFALSE oper
f0b0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 66  ator */.      if
f0c0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 64 54  ( sqlite3ExprIdT
f0d0: 6f 54 72 75 65 46 61 6c 73 65 28 70 45 78 70 72  oTrueFalse(pExpr
f0e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
f0f0: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
f100: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
f110: 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  Fall thru */.   
f120: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
f130: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
f140: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
f150: 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
f160: 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  N:.      testcas
f170: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
f180: 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _ID );.      tes
f190: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
f1a0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
f1b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
f1c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
f1d0: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
f1e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
f1f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
f200: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69  OLUMN );.      i
f210: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
f220: 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69  e==3 && pExpr->i
f230: 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
f240: 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  u.iCur ){.      
f250: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
f260: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
f270: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
f280: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
f290: 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a   TK_IF_NULL_ROW:
f2a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
f2b0: 49 53 54 45 52 3a 0a 20 20 20 20 20 20 74 65 73  ISTER:.      tes
f2c0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
f2d0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
f2e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f2f0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
f300: 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20  F_NULL_ROW );.  
f310: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
f320: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  de = 0;.      re
f330: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
f340: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
f350: 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  ABLE:.      if( 
f360: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
f370: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 ){.        /* 
f380: 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  Silently convert
f390: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
f3a0: 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
f3b0: 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20  side of CREATE. 
f3c0: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d         ** statem
f3d0: 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c  ents into a NULL
f3e0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68   when parsing th
f3f0: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
f400: 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20  nt text out.    
f410: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71      ** of the sq
f420: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
f430: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78  e */.        pEx
f440: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
f450: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f460: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
f470: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
f480: 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
f490: 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
f4a0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
f4b0: 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
f4c0: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
f4d0: 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
f4e0: 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
f4f0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
f500: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
f510: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
f520: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
f530: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
f540: 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c  gh */.    defaul
f550: 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t:.      testcas
f560: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
f570: 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71  _SELECT ); /* sq
f580: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
f590: 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20  ail() disallows 
f5a0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
f5b0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
f5c0: 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 71  _EXISTS ); /* sq
f5d0: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
f5e0: 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20  ail() disallows 
f5f0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
f600: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
f610: 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  }.}.static int e
f620: 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20  xprIsConst(Expr 
f630: 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67  *p, int initFlag
f640: 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57  , int iCur){.  W
f650: 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
f660: 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20  de = initFlag;. 
f670: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
f680: 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e   = exprNodeIsCon
f690: 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65  stant;.  w.xSele
f6a0: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ctCallback = sql
f6b0: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
f6c0: 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  il;.#ifdef SQLIT
f6d0: 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c  E_DEBUG.  w.xSel
f6e0: 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
f6f0: 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
f700: 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a  Assert2;.#endif.
f710: 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75    w.u.iCur = iCu
f720: 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  r;.  sqlite3Walk
f730: 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
f740: 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
f750: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
f760: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
f770: 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
f780: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
f790: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
f7a0: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
f7b0: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
f7c0: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
f7d0: 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  lls..**.** For t
f7e0: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
f7f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
f800: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
f810: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
f820: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
f830: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
f840: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
f850: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
f860: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
f870: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
f880: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
f890: 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  nt(Expr *p){.  r
f8a0: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
f8b0: 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f  t(p, 1, 0);.}../
f8c0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
f8d0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
f8e0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
f8f0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
f900: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
f910: 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69  that does no ori
f920: 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20  ginate from the 
f930: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
f940: 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a  ses of a join..*
f950: 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69 74  * Return 0 if it
f960: 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62   involves variab
f970: 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20  les or function 
f980: 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66  calls or terms f
f990: 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20  rom.** an ON or 
f9a0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f  USING clause..*/
f9b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
f9c0: 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
f9d0: 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  n(Expr *p){.  re
f9e0: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
f9f0: 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  (p, 2, 0);.}../*
fa00: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
fa10: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
fa20: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
fa30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
fa40: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66  is constant.** f
fa50: 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f  or any single ro
fa60: 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  w of the table w
fa70: 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72 2e  ith cursor iCur.
fa80: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
fa90: 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  , the.** express
faa0: 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65 66  ion must not ref
fab0: 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65  er to any non-de
fac0: 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63  terministic func
fad0: 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20  tion nor any.** 
fae0: 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e  table other than
faf0: 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71   iCur..*/.int sq
fb00: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
fb10: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
fb20: 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 72  , int iCur){.  r
fb30: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
fb40: 74 28 70 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d  t(p, 3, iCur);.}
fb50: 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  .../*.** sqlite3
fb60: 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62  WalkExpr() callb
fb70: 61 63 6b 20 75 73 65 64 20 62 79 20 73 71 6c 69  ack used by sqli
fb80: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
fb90: 74 4f 72 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f  tOrGroupBy()..*/
fba0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
fbb0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72  NodeIsConstantOr
fbc0: 47 72 6f 75 70 42 79 28 57 61 6c 6b 65 72 20 2a  GroupBy(Walker *
fbd0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
fbe0: 45 78 70 72 29 7b 0a 20 20 45 78 70 72 4c 69 73  Expr){.  ExprLis
fbf0: 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 57  t *pGroupBy = pW
fc00: 61 6c 6b 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42  alker->u.pGroupB
fc10: 79 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  y;.  int i;..  /
fc20: 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78 70 72  * Check if pExpr
fc30: 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f   is identical to
fc40: 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65   any GROUP BY te
fc50: 72 6d 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69  rm. If so, consi
fc60: 64 65 72 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73  der.  ** it cons
fc70: 74 61 6e 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28  tant.  */.  for(
fc80: 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  i=0; i<pGroupBy-
fc90: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
fca0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 47 72 6f    Expr *p = pGro
fcb0: 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
fcc0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
fcd0: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
fce0: 70 45 78 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20  pExpr, p, -1)<2 
fcf0: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
fd00: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
fd10: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70  3ExprNNCollSeq(p
fd20: 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20  Walker->pParse, 
fd30: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  p);.      if( sq
fd40: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22 42  lite3_stricmp("B
fd50: 49 4e 41 52 59 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  INARY", pColl->z
fd60: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
fd70: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
fd80: 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
fd90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
fda0: 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20  eck if pExpr is 
fdb0: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 66  a sub-select. If
fdc0: 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69 74   so, consider it
fdd0: 20 76 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20   variable. */.  
fde0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
fdf0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
fe00: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
fe10: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
fe20: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   0;.    return W
fe30: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
fe40: 20 72 65 74 75 72 6e 20 65 78 70 72 4e 6f 64 65   return exprNode
fe50: 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b  IsConstant(pWalk
fe60: 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  er, pExpr);.}../
fe70: 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65 78  *.** Walk the ex
fe80: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 70 61  pression tree pa
fe90: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
fea0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
feb0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69  rn non-zero.** i
fec0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
fed0: 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
fee0: 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20  ly of constants 
fef0: 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 74 65 72  or copies of ter
ff00: 6d 73 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70  ms .** in pGroup
ff10: 42 79 20 74 68 61 74 20 73 6f 72 74 20 77 69 74  By that sort wit
ff20: 68 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c  h the BINARY col
ff30: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
ff40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ff50: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
ff60: 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20 74 65  etermine if a te
ff70: 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47  rm of the HAVING
ff80: 20 63 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62   clause can.** b
ff90: 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20  e promoted into 
ffa0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
ffb0: 2e 20 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  .  In order for 
ffc0: 73 75 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e  such a promotion
ffd0: 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65   to work,.** the
ffe0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 48 41   value of the HA
fff0: 56 49 4e 47 20 63 6c 61 75 73 65 20 74 65 72 6d  VING clause term
10000 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
10010 65 20 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72  e for all member
10020 73 20 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70  s of.** a "group
10030 22 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d  ".  The requirem
10040 65 6e 74 20 74 68 61 74 20 74 68 65 20 47 52 4f  ent that the GRO
10050 55 50 20 42 59 20 74 65 72 6d 20 6d 75 73 74 20  UP BY term must 
10060 62 65 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73  be BINARY.** ass
10070 75 6d 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  umes that no oth
10080 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  er collating seq
10090 75 65 6e 63 65 20 77 69 6c 6c 20 68 61 76 65 20  uence will have 
100a0 61 20 66 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a  a finer-grained.
100b0 2a 2a 20 67 72 6f 75 70 69 6e 67 20 74 68 61 6e  ** grouping than
100c0 20 62 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68   binary.  In oth
100d0 65 72 20 77 6f 72 64 73 20 28 41 3d 42 20 43 4f  er words (A=B CO
100e0 4c 4c 41 54 45 20 62 69 6e 61 72 79 29 20 69 6d  LLATE binary) im
100f0 70 6c 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20  plies.** A=B in 
10100 65 76 65 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c  every other coll
10110 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ating sequence. 
10120 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   The requirement
10130 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f   that the.** GRO
10140 55 50 20 42 59 20 62 65 20 42 49 4e 41 52 59 20  UP BY be BINARY 
10150 69 73 20 73 74 72 69 63 74 65 72 20 74 68 61 6e  is stricter than
10160 20 6e 65 63 65 73 73 61 72 79 2e 20 20 49 74 20   necessary.  It 
10170 77 6f 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a  would also work.
10180 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41  ** to promote HA
10190 56 49 4e 47 20 63 6c 61 75 73 65 73 20 74 68 61  VING clauses tha
101a0 74 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 61  t use the same a
101b0 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
101c0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
101d0 20 61 73 20 74 68 65 20 47 52 4f 55 50 20 42 59   as the GROUP BY
101e0 20 74 65 72 6d 2c 20 62 75 74 20 74 68 61 74 20   term, but that 
101f0 69 73 20 6d 75 63 68 20 68 61 72 64 65 72 20 74  is much harder t
10200 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65  o check,.** alte
10210 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
10220 67 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20  g sequences are 
10230 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68  uncommon, and th
10240 69 73 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a  is is only an.**
10250 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73   optimization, s
10260 6f 20 77 65 20 74 61 6b 65 20 74 68 65 20 65 61  o we take the ea
10270 73 79 20 77 61 79 20 6f 75 74 20 61 6e 64 20 73  sy way out and s
10280 69 6d 70 6c 79 20 72 65 71 75 69 72 65 20 74 68  imply require th
10290 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 74 6f  e.** GROUP BY to
102a0 20 75 73 65 20 74 68 65 20 42 49 4e 41 52 59 20   use the BINARY 
102b0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
102c0 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
102d0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
102e0 4f 72 47 72 6f 75 70 42 79 28 50 61 72 73 65 20  OrGroupBy(Parse 
102f0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
10300 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f  , ExprList *pGro
10310 75 70 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20  upBy){.  Walker 
10320 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31  w;.  w.eCode = 1
10330 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
10340 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73  ack = exprNodeIs
10350 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
10360 79 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  y;.  w.xSelectCa
10370 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e  llback = 0;.  w.
10380 75 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  u.pGroupBy = pGr
10390 6f 75 70 42 79 3b 0a 20 20 77 2e 70 50 61 72 73  oupBy;.  w.pPars
103a0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
103b0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
103c0 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
103d0 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
103e0 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
103f0 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
10400 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
10410 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10420 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
10430 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
10440 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
10450 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
10460 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
10470 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
10480 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
10490 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
104a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
104b0 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
104c0 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
104d0 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
104e0 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
104f0 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
10500 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
10510 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
10520 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
10530 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
10540 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
10550 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29  r *p, u8 isInit)
10560 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e  {.  assert( isIn
10570 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d  it==0 || isInit=
10580 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
10590 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b  xprIsConst(p, 4+
105a0 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23  isInit, 0);.}..#
105b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
105c0 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
105d0 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
105e0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
105f0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
10600 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
10610 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65  ains a.** subque
10620 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  ry of some kind.
10630 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
10640 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75  ere are no subqu
10650 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eries..*/.int sq
10660 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e  lite3ExprContain
10670 73 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a  sSubquery(Expr *
10680 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
10690 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20    w.eCode = 1;. 
106a0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
106b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
106c0 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c  lkNoop;.  w.xSel
106d0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
106e0 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
106f0 61 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ail;.#ifdef SQLI
10700 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65  TE_DEBUG.  w.xSe
10710 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
10720 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
10730 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66  kAssert2;.#endif
10740 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
10750 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
10760 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a  urn w.eCode==0;.
10770 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10780 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
10790 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
107a0 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
107b0 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
107c0 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
107d0 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
107e0 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
107f0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
10800 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
10810 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
10820 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10830 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
10840 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
10850 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
10860 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
10870 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
10880 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
10890 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
108a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
108b0 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
108c0 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
108d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
108e0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
108f0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f  urn 0;  /* Can o
10900 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f  nly happen follo
10910 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a  wing on OOM */..
10920 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65    /* If an expre
10930 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
10940 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ger literal that
10950 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65   fits in a signe
10960 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e  d 32-bit.  ** in
10970 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
10980 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67  EP_IntValue flag
10990 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
109a0 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20  dy been set */. 
109b0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
109c0 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70  TK_INTEGER || (p
109d0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
109e0 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20  Value)!=0.      
109f0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
10a00 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f  etInt32(p->u.zTo
10a10 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a  ken, &rc)==0 );.
10a20 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
10a30 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
10a40 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70  .    *pValue = p
10a50 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
10a60 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
10a70 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
10a80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
10a90 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
10aa0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
10ab0 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
10ac0 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
10ad0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10ae0 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
10af0 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
10b00 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
10b10 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
10b20 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
10b30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76         assert( v
10b40 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31  !=(-2147483647-1
10b50 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) );.        *pV
10b60 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
10b70 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
10b80 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10b90 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
10ba0 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  t: break;.  }.  
10bb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10bc0 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
10bd0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
10be0 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
10bf0 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
10c00 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e NULL..**.** If
10c10 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10c20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72  might be NULL or
10c30 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
10c40 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65  on is too comple
10c50 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74  x.** to tell ret
10c60 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a  urn TRUE.  .**.*
10c70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10c80 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74  s used as an opt
10c90 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b  imization, to sk
10ca0 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63  ip OP_IsNull opc
10cb0 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20  odes.** when we 
10cc0 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75  know that a valu
10cd0 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  e cannot be NULL
10ce0 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73  .  Hence, a fals
10cf0 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72  e positive.** (r
10d00 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68  eturning TRUE wh
10d10 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65  en in fact the e
10d20 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65  xpression can ne
10d30 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67  ver be NULL) mig
10d40 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c  ht.** be a small
10d50 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
10d60 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
10d70 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20  e harmless.  On 
10d80 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e  the other.** han
10d90 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74  d, a false negat
10da0 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46  ive (returning F
10db0 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65  ALSE when the re
10dc0 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55  sult could be NU
10dd0 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65  LL).** will like
10de0 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
10df0 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
10e00 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f  .  So when in do
10e10 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54  ubt, return.** T
10e20 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  RUE..*/.int sqli
10e30 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
10e40 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b  (const Expr *p){
10e50 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c  .  u8 op;.  whil
10e60 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
10e70 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
10e80 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
10e90 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
10ea0 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
10eb0 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
10ec0 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
10ed0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
10ee0 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
10ef0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
10f00 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
10f10 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
10f20 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  e TK_BLOB:.     
10f30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63   return 0;.    c
10f40 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
10f50 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72       return Expr
10f60 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
10f70 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a  P_CanBeNull) ||.
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
10f90 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20 52  pTab==0 ||  /* R
10fa0 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f 6c 75  eference to colu
10fb0 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e 20 65  mn of index on e
10fc0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
10fd0 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43            (p->iC
10fe0 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70  olumn>=0 && p->p
10ff0 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f  Tab->aCol[p->iCo
11000 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
11010 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  );.    default:.
11020 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
11030 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
11040 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
11050 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
11060 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77   is a constant w
11070 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a  hich would be.**
11080 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50   unchanged by OP
11090 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74  _Affinity with t
110a0 68 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65  he affinity give
110b0 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  n in the second.
110c0 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
110d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
110e0 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
110f0 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41  mine if the OP_A
11100 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f  ffinity operatio
11110 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74  n.** can be omit
11120 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f  ted.  When in do
11130 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ubt return FALSE
11140 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74  .  A false negat
11150 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65  ive.** is harmle
11160 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73  ss.  A false pos
11170 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20  itive, however, 
11180 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68  can result in th
11190 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65  e wrong.** answe
111a0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
111b0 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
111c0 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74  nityChange(const
111d0 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61   Expr *p, char a
111e0 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  ff){.  u8 op;.  
111f0 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  if( aff==SQLITE_
11200 41 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72  AFF_BLOB ) retur
11210 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  n 1;.  while( p-
11220 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
11230 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
11240 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
11250 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
11260 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
11270 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
11280 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
11290 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
112a0 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
112b0 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
112c0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
112d0 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  GER || aff==SQLI
112e0 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
112f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11300 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
11310 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
11320 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20  ITE_AFF_REAL || 
11330 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11340 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20  NUMERIC;.    }. 
11350 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
11360 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  G: {.      retur
11370 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
11380 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  F_TEXT;.    }.  
11390 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
113a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
113b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
113c0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
113d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
113e0 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  Table>=0 );  /* 
113f0 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74  p cannot be part
11400 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73   of a CHECK cons
11410 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
11420 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d  return p->iColum
11430 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  n<0.          &&
11440 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
11450 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
11460 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
11470 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ERIC);.    }.   
11480 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
11490 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
114a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
114b0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
114c0 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69  e given string i
114d0 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d  s a row-id colum
114e0 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73  n name..*/.int s
114f0 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f  qlite3IsRowid(co
11500 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
11510 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
11520 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29  mp(z, "_ROWID_")
11530 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
11540 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
11550 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29  ICmp(z, "ROWID")
11560 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
11570 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
11580 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d  ICmp(z, "OID")==
11590 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
115a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
115b0 2a 2a 20 70 58 20 69 73 20 74 68 65 20 52 48 53  ** pX is the RHS
115c0 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   of an IN operat
115d0 6f 72 2e 20 20 49 66 20 70 58 20 69 73 20 61 20  or.  If pX is a 
115e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
115f0 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65   .** that can be
11600 20 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61   simplified to a
11610 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 61 63   direct table ac
11620 63 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72  cess, then retur
11630 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
11640 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  o the SELECT sta
11650 74 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69  tement.  If pX i
11660 73 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73  s not a SELECT s
11670 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20  tatement,.** or 
11680 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  if the SELECT st
11690 61 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f  atement needs to
116a0 20 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69   be manifested i
116b0 6e 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a  nto a transient.
116c0 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72  ** table, then r
116d0 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23  eturn NULL..*/.#
116e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
116f0 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74  IT_SUBQUERY.stat
11700 69 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e  ic Select *isCan
11710 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45  didateForInOpt(E
11720 78 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65  xpr *pX){.  Sele
11730 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74  ct *p;.  SrcList
11740 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69   *pSrc;.  ExprLi
11750 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61  st *pEList;.  Ta
11760 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
11770 20 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   i;.  if( !ExprH
11780 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
11790 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72  P_xIsSelect) ) r
117a0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74  eturn 0;  /* Not
117b0 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20   a subquery */. 
117c0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
117d0 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53  erty(pX, EP_VarS
117e0 65 6c 65 63 74 29 20 20 29 20 72 65 74 75 72 6e  elect)  ) return
117f0 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74   0;  /* Correlat
11800 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d  ed subq */.  p =
11810 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a   pX->x.pSelect;.
11820 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
11830 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
11840 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
11850 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
11860 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65  T */.  if( p->se
11870 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
11880 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
11890 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63  te) ){.    testc
118a0 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
118b0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
118c0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
118d0 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
118e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
118f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
11900 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
11910 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
11920 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65  regate );.    re
11930 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49  turn 0; /* No DI
11940 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61  STINCT keyword a
11950 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  nd no aggregate 
11960 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d  functions */.  }
11970 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47  .  assert( p->pG
11980 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20  roupBy==0 );    
11990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
119a0 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
119b0 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
119c0 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
119d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
119e0 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20  /* Has no LIMIT 
119f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
11a00 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
11a10 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
11a20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45     /* Has no WHE
11a30 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70  RE clause */.  p
11a40 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
11a50 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
11a60 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   );.  if( pSrc->
11a70 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
11a80 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
11a90 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46  Single term in F
11aa0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
11ab0 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  if( pSrc->a[0].p
11ac0 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
11ad0 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69  0;     /* FROM i
11ae0 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  s not a subquery
11af0 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54   or view */.  pT
11b00 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  ab = pSrc->a[0].
11b10 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  pTab;.  assert( 
11b20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
11b30 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65  ert( pTab->pSele
11b40 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  ct==0 );        
11b50 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
11b60 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  se is not a view
11b70 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
11b80 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
11b90 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  rn 0;        /* 
11ba0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20  FROM clause not 
11bb0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
11bc0 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
11bd0 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  >pEList;.  asser
11be0 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
11bf0 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20    /* All SELECT 
11c00 72 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20  results must be 
11c10 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f  columns. */.  fo
11c20 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
11c30 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11c40 20 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70    Expr *pRes = p
11c50 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
11c60 72 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d  r;.    if( pRes-
11c70 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
11c80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61   return 0;.    a
11c90 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61  ssert( pRes->iTa
11ca0 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e  ble==pSrc->a[0].
11cb0 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e  iCursor );  /* N
11cc0 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  ot a correlated 
11cd0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a  subquery */.  }.
11ce0 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65    return p;.}.#e
11cf0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11d00 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
11d10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11d20 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
11d30 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
11d40 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68  e that checks th
11d50 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
11d60 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c  mn of index tabl
11d70 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69 66  e iCur to see if
11d80 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  .** it contains 
11d90 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73  any NULL entries
11da0 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65 67  .  Cause the reg
11db0 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73 4e  ister at regHasN
11dc0 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a  ull to be set.**
11dd0 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   to a non-NULL v
11de0 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e  alue if iCur con
11df0 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20  tains no NULLs. 
11e00 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72 20   Cause register 
11e10 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f  regHasNull.** to
11e20 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
11e30 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
11e40 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
11e50 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  L values..*/.sta
11e60 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
11e70 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56  SetHasNullFlag(V
11e80 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72  dbe *v, int iCur
11e90 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c  , int regHasNull
11ea0 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a  ){.  int addr1;.
11eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11ec0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
11ed0 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
11ee0 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
11ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11f00 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  , OP_Rewind, iCu
11f10 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
11f20 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
11f30 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
11f40 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20  olumn, iCur, 0, 
11f50 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73  regHasNull);.  s
11f60 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
11f70 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50  P5(v, OPFLAG_TYP
11f80 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43  EOFARG);.  VdbeC
11f90 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73  omment((v, "firs
11fa0 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c  t_entry_in(%d)",
11fb0 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74   iCur));.  sqlit
11fc0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
11fd0 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64  , addr1);.}.#end
11fe0 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
11ff0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
12000 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  Y./*.** The argu
12010 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70  ment is an IN op
12020 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69  erator with a li
12030 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65  st (not a subque
12040 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72  ry) on the .** r
12050 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20  ight-hand side. 
12060 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
12070 74 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e  that list is con
12080 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  stant..*/.static
12090 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68   int sqlite3InRh
120a0 73 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  sIsConstant(Expr
120b0 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a   *pIn){.  Expr *
120c0 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b  pLHS;.  int res;
120d0 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
120e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c  HasProperty(pIn,
120f0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
12100 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e  ;.  pLHS = pIn->
12110 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c  pLeft;.  pIn->pL
12120 65 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d  eft = 0;.  res =
12130 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
12140 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70  nstant(pIn);.  p
12150 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53  In->pLeft = pLHS
12160 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
12170 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
12180 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12190 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70   used by the imp
121a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
121b0 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72  he IN (...) oper
121c0 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20  ator..** The pX 
121d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
121e0 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74   expression on t
121f0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
12200 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68   operator, which
12210 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74  .** might be eit
12220 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78  her a list of ex
12230 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73  pressions or a s
12240 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  ubquery..**.** T
12250 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
12260 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e  outine is to fin
12270 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d  d or create a b-
12280 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
12290 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
122a0 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66  either to test f
122b0 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e  or membership in
122c0 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72 20   the RHS set or 
122d0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
122e0 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72  gh.** all member
122f0 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74  s of the RHS set
12300 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
12310 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63  cates..**.** A c
12320 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20  ursor is opened 
12330 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  on the b-tree ob
12340 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68 65  ject that is the
12350 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
12360 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70  perator.** and p
12370 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74  X->iTable is set
12380 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
12390 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a   that cursor..**
123a0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
123b0 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
123c0 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65  unction indicate
123d0 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70  s the b-tree typ
123e0 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  e, as follows:.*
123f0 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  *.**   IN_INDEX_
12400 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68 65  ROWID      - The
12410 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
12420 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
12430 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
12440 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
12450 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
12460 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61  s opened on an a
12470 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a  scending index..
12480 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
12490 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63  DEX_DESC - The c
124a0 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
124b0 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
124c0 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
124d0 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20 20  INDEX_EPH       
124e0 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
124f0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70  s opened on a sp
12500 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20  ecially created 
12510 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12530 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
12540 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49  al table..**   I
12550 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20  N_INDEX_NOOP    
12560 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77     - No cursor w
12570 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54  as allocated.  T
12580 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d  he IN operator m
12590 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  ust be.**       
125a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125b0 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73    implemented as
125c0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63   a sequence of c
125d0 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a  omparisons..**.*
125e0 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d  * An existing b-
125f0 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75 73  tree might be us
12600 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65 78  ed if the RHS ex
12610 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61  pression pX is a
12620 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75   simple.** subqu
12630 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a  ery such as:.**.
12640 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63  **     SELECT <c
12650 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e  olumn1>, <column
12660 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c  2>... FROM <tabl
12670 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e>.**.** If the 
12680 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
12690 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
126a0 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c   or a more compl
126b0 65 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65  ex subquery, the
126c0 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61  n.** an ephemera
126d0 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65  l table might ne
126e0 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  ed to be generat
126f0 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20  ed from the RHS 
12700 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e  and then.** pX->
12710 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70  iTable made to p
12720 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65  oint to the ephe
12730 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74  meral table inst
12740 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69  ead of an.** exi
12750 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a  sting table..**.
12760 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70  ** The inFlags p
12770 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f  arameter must co
12780 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69  ntain, at a mini
12790 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20  mum, one of the 
127a0 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  bits.** IN_INDEX
127b0 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49  _MEMBERSHIP or I
127c0 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74  N_INDEX_LOOP but
127d0 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49 66 20 69   not both.  If i
127e0 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a  nFlags contains.
127f0 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  ** IN_INDEX_MEMB
12800 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65  ERSHIP, then the
12810 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
12820 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
12830 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62  r a fast.** memb
12840 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68  ership test.  Wh
12850 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  en the IN_INDEX_
12860 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c  LOOP bit is set,
12870 20 74 68 65 20 49 4e 20 69 6e 64 65 78 20 77 69   the IN index wi
12880 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  ll.** be used to
12890 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76   loop over all v
128a0 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53  alues of the RHS
128b0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
128c0 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  tor..**.** When 
128d0 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73  IN_INDEX_LOOP is
128e0 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62   used (and the b
128f0 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
12900 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a  ed to iterate.**
12910 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74   through the set
12920 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74   members) then t
12930 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e  he b-tree must n
12940 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69  ot contain dupli
12950 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68  cates..** An eph
12960 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c  eremal table wil
12970 6c 20 62 65 20 63 72 65 61 74 65 64 20 75 6e 6c  l be created unl
12980 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
12990 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61   columns are gua
129a0 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
129b0 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
129c0 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
129d0 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
129e0 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a  Y KEY or due to.
129f0 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73  ** a UNIQUE cons
12a00 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e  traint or index.
12a10 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
12a20 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
12a30 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
12a40 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
12a50 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
12a60 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
12a70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20   tests) then an 
12a80 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
12a90 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
12aa0 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73   unless <columns
12ab0 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e  > is a single IN
12ac0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
12ad0 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a  Y column or an .
12ae0 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  ** index can be 
12af0 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73  found with the s
12b00 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e  pecified <column
12b10 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  s> as its left-m
12b20 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ost..**.** If th
12b30 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  e IN_INDEX_NOOP_
12b40 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  OK and IN_INDEX_
12b50 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62  MEMBERSHIP are b
12b60 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69  oth set and.** i
12b70 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
12b80 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
12b90 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
12ba0 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69  bquery) then thi
12bb0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67  s.** routine mig
12bc0 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63  ht decide that c
12bd0 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
12be0 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20  eral b-tree for 
12bf0 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65  membership.** te
12c00 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70  sting is too exp
12c10 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72  ensive and retur
12c20 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
12c30 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
12c40 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  the.** calling r
12c50 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d  outine should im
12c60 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f  plement the IN o
12c70 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20  perator using a 
12c80 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45  sequence.** of E
12c90 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73  q or Ne comparis
12ca0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  on operations..*
12cb0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d  *.** When the b-
12cc0 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73  tree is being us
12cd0 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ed for membershi
12ce0 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c  p tests, the cal
12cf0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
12d00 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b   might need to k
12d10 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
12d20 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20  ot the RHS side 
12d30 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
12d40 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  or.** contains a
12d50 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73   NULL.  If prRhs
12d60 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61  HasNull is not a
12d70 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e   NULL pointer an
12d80 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  d .** if there i
12d90 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61  s any chance tha
12da0 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68  t the (...) migh
12db0 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
12dc0 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
12dd0 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
12de0 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
12df0 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
12e00 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
12e10 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48  en.** to *prRhsH
12e20 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65  asNull. If there
12e30 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
12e40 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e  at the (...) con
12e50 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
12e60 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52  value, then *prR
12e70 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66  hsHasNull is lef
12e80 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
12e90 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
12ea0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
12eb0 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73  d its location s
12ec0 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48  tored in *prRhsH
12ed0 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20  asNull, then.** 
12ee0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61  the value in tha
12ef0 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20  t register will 
12f00 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62  be NULL if the b
12f10 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f  -tree contains o
12f20 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55  ne or more.** NU
12f30 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69  LL values, and i
12f40 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e  t will be some n
12f50 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
12f60 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74   the b-tree cont
12f70 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20  ains no.** NULL 
12f80 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  values..**.** If
12f90 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d   the aiMap param
12fa0 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  eter is not NULL
12fb0 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  , it must point 
12fc0 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74  to an array cont
12fd0 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c  aining.** one el
12fe0 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63  ement for each c
12ff0 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62  olumn returned b
13000 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
13010 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48  tement on the RH
13020 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e  S.** of the IN(.
13030 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68  ..) operator. Th
13040 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20  e i'th entry of 
13050 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70  the array is pop
13060 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ulated with the.
13070 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  ** offset of the
13080 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
13090 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
130a0 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72  'th column retur
130b0 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45  ned by the.** SE
130c0 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c  LECT. For exampl
130d0 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73  e, if the expres
130e0 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65  sion and selecte
130f0 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a  d index are:.**.
13100 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20  **   (?,?,?) IN 
13110 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20  (SELECT a, b, c 
13120 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52  FROM t1).**   CR
13130 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
13140 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a   t1(b, c, a);.**
13150 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d  .** then aiMap[]
13160 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
13170 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f  th {2, 0, 1}..*/
13180 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13190 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
131a0 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  t sqlite3FindInI
131b0 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
131c0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
131d0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
131e0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
131f0 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pX,            
13200 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
13210 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
13220 53 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  S) of the IN ope
13230 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69  rator */.  u32 i
13240 6e 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  nFlags,         
13250 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45        /* IN_INDE
13260 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53  X_LOOP, _MEMBERS
13270 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f  HIP, and/or _NOO
13280 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  P_OK */.  int *p
13290 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20  rRhsHasNull,    
132a0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
132b0 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74   holding NULL st
132c0 61 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73  atus.  See notes
132d0 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
13300 20 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f   Index fields to
13310 20 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29   RHS fields */.)
13320 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
13350 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
13360 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
13370 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
13380 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
13390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
133a0 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
133b0 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
133c0 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
133d0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
133e0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
133f0 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
13400 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
13410 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20  eUnique;        
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13430 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
13440 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
13450 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
13460 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13470 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
13480 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
13490 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
134a0 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
134b0 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71   );.  mustBeUniq
134c0 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20  ue = (inFlags & 
134d0 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d  IN_INDEX_LOOP)!=
134e0 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
134f0 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e  RHS of this IN(.
13500 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ..) operator is 
13510 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66  a SELECT, and if
13520 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a   it matters .  *
13530 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
13540 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75   the SELECT resu
13550 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  lt contains NULL
13560 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77   values, check w
13570 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
13580 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61  ot NULL is actua
13590 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74  lly possible (it
135a0 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72   may not be, for
135b0 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20   example, due . 
135c0 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20   ** to NOT NULL 
135d0 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
135e0 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e  he schema). If n
135f0 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
13600 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a  e possible,.  **
13610 20 73 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c   set prRhsHasNul
13620 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f  l to 0 before co
13630 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20  ntinuing.  */.  
13640 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
13650 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20 26   && (pX->flags &
13660 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
13670 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
13680 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
13690 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  t = pX->x.pSelec
136a0 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66  t->pEList;.    f
136b0 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
136c0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
136d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
136e0 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45  ExprCanBeNull(pE
136f0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
13700 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
13710 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69  .    if( i==pELi
13720 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
13730 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20     prRhsHasNull 
13740 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
13750 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
13760 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
13770 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
13780 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
13790 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
137a0 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
137b0 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
137c0 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
137d0 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
137e0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  able.  */.  if( 
137f0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
13800 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64  && (p = isCandid
13810 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29  ateForInOpt(pX))
13820 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
13830 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
13840 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
13850 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
13860 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nnection */.    
13870 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
13880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13890 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
138a0 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
138b0 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20  i16 iDb;        
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
138e0 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20  se idx for pTab 
138f0 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
13900 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  *pEList = p->pEL
13910 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78  ist;.    int nEx
13920 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
13930 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  pr;..    assert(
13940 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13960 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
13970 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
13980 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
13990 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
139a0 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20  .pExpr!=0 ); /* 
139b0 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
139c0 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
139d0 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
139e0 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20   p->pSrc!=0 );  
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a00 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
13a10 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
13a20 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  ) */.    pTab = 
13a30 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
13a40 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65  ab;..    /* Code
13a50 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69   an OP_Transacti
13a60 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c  on and OP_TableL
13a70 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e  ock for <table>.
13a80 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
13a90 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
13aa0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
13ab0 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  hema);.    sqlit
13ac0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
13ad0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
13ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
13af0 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
13b00 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
13b10 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
13b20 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 20  .    assert(v); 
13b30 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64   /* sqlite3GetVd
13b40 62 65 28 29 20 68 61 73 20 61 6c 77 61 79 73 20  be() has always 
13b50 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
13b60 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66  called */.    if
13b70 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45  ( nExpr==1 && pE
13b80 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
13b90 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
13ba0 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49       /* The "x I
13bb0 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20  N (SELECT rowid 
13bc0 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73  FROM table)" cas
13bd0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  e */.      int i
13be0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
13bf0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
13c00 6e 63 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  nce);.      Vdbe
13c10 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
13c20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
13c30 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
13c40 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
13c50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
13c60 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
13c70 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20  EX_ROWID;..     
13c80 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13c90 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
13ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13cb0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cd0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
13ce0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
13cf0 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
13d00 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  _ok = 1;.      i
13d10 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nt i;..      /* 
13d20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  Check that the a
13d30 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c  ffinity that wil
13d40 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72  l be used to per
13d50 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20 20 20  form each .     
13d60 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   ** comparison i
13d70 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
13d80 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 65 61  e affinity of ea
13d90 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62  ch column in tab
13da0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
13db0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
13dc0 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 69   operator.  If i
13dd0 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  t not, it is not
13de0 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20 20 20   possible to.   
13df0 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e     ** use any in
13e00 64 65 78 20 6f 66 20 74 68 65 20 52 48 53 20 74  dex of the RHS t
13e10 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  able.  */.      
13e20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
13e30 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b   && affinity_ok;
13e40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
13e50 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
13e60 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
13e70 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
13e80 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   i);.        int
13e90 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e   iCol = pEList->
13ea0 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[i].pExpr->iCol
13eb0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61  umn;.        cha
13ec0 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c 69 74  r idxaff = sqlit
13ed0 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66  e3TableColumnAff
13ee0 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f 6c 29  inity(pTab,iCol)
13ef0 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65 20 2a  ; /* RHS table *
13f00 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  /.        char c
13f10 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43  mpaff = sqlite3C
13f20 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
13f30 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a 20 20  Lhs, idxaff);.  
13f40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13f50 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  cmpaff==SQLITE_A
13f60 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20  FF_BLOB );.     
13f70 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70     testcase( cmp
13f80 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
13f90 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
13fa0 73 77 69 74 63 68 28 20 63 6d 70 61 66 66 20 29  switch( cmpaff )
13fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
13fc0 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
13fd0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  :.            br
13fe0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eak;.          c
13ff0 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
14000 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20  EXT:.           
14010 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d 70 61   /* sqlite3Compa
14020 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c  reAffinity() onl
14030 79 20 72 65 74 75 72 6e 73 20 54 45 58 54 20 69  y returns TEXT i
14040 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  f one side or th
14050 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
14060 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20 61 66   other has no af
14070 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65 20 6f  finity and the o
14080 74 68 65 72 20 73 69 64 65 20 69 73 20 54 45 58  ther side is TEX
14090 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20 20 20  T.  Hence,.     
140a0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e         ** the on
140b0 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70 61 66  ly way for cmpaf
140c0 66 20 74 6f 20 62 65 20 54 45 58 54 20 69 73 20  f to be TEXT is 
140d0 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20 62 65  for idxaff to be
140e0 20 54 45 58 54 0a 20 20 20 20 20 20 20 20 20 20   TEXT.          
140f0 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74 68 65    ** and for the
14100 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53   term on the LHS
14110 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20 68 61   of the IN to ha
14120 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20  ve no affinity. 
14130 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  */.            a
14140 73 73 65 72 74 28 20 69 64 78 61 66 66 3d 3d 53  ssert( idxaff==S
14150 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
14160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
14170 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64  eak;.          d
14180 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
14190 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20      affinity_ok 
141a0 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  = sqlite3IsNumer
141b0 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 61 66  icAffinity(idxaf
141c0 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  f);.        }.  
141d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
141e0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a   affinity_ok ){.
141f0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
14200 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
14210 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 69 6c  g index that wil
14220 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69 73 20  l work for this 
14230 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
14240 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
14250 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
14260 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 3b 20  dx && eType==0; 
14270 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
14280 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  ){.          Bit
14290 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20  mask colUsed;   
142a0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66     /* Columns of
142b0 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
142c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  */.          Bit
142d0 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20  mask mCol;      
142e0 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74     /* Mask for t
142f0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d  he current colum
14300 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  n */.          i
14310 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
14320 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69 6e 75  <nExpr ) continu
14330 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;.          /* 
14340 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20  Maximum nColumn 
14350 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d  is BMS-2, not BM
14360 53 2d 31 2c 20 73 6f 20 74 68 61 74 20 77 65 20  S-1, so that we 
14370 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20 20  can compute.    
14380 20 20 20 20 20 20 2a 2a 20 42 49 54 4d 41 53 4b        ** BITMASK
14390 28 6e 45 78 70 72 29 20 77 69 74 68 6f 75 74 20  (nExpr) without 
143a0 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20  overflowing */. 
143b0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
143c0 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  e( pIdx->nColumn
143d0 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20  ==BMS-2 );.     
143e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
143f0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d  Idx->nColumn==BM
14400 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  S-1 );.         
14410 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
14420 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e 74  mn>=BMS-1 ) cont
14430 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
14440 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65  if( mustBeUnique
14450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14460 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  if( pIdx->nKeyCo
14470 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  l>nExpr.        
14480 20 20 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e 43       ||(pIdx->nC
14490 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20 21  olumn>nExpr && !
144a0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
144b0 64 78 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  dx)).           
144c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
144d0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
144e0 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f  This index is no
144f0 74 20 75 6e 69 71 75 65 20 6f 76 65 72 20 74 68  t unique over th
14500 65 20 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e 73  e IN RHS columns
14510 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
14520 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
14530 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73  .          colUs
14540 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6c  ed = 0;   /* Col
14550 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 20 75 73  umns of index us
14560 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  ed so far */.   
14570 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
14580 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  i<nExpr; i++){. 
14590 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
145a0 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56  *pLhs = sqlite3V
145b0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
145c0 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b  r(pX->pLeft, i);
145d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
145e0 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73 74  r *pRhs = pEList
145f0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
14600 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
14610 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65  q *pReq = sqlite
14620 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
14630 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
14640 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20  hs, pRhs);.     
14650 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
14660 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
14670 65 72 74 28 20 70 52 65 71 21 3d 30 20 7c 7c 20  ert( pReq!=0 || 
14680 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58  pRhs->iColumn==X
14690 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 61 72 73  N_ROWID || pPars
146a0 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20 20  e->nErr );.     
146b0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
146c0 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  j<nExpr; j++){. 
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
146e0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
146f0 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d  j]!=pRhs->iColum
14700 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
14710 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
14720 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  rt( pIdx->azColl
14730 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  [j] );.         
14740 20 20 20 20 20 69 66 28 20 70 52 65 71 21 3d 30       if( pReq!=0
14750 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
14760 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20  mp(pReq->zName, 
14770 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  pIdx->azColl[j])
14780 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
14790 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
147a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
147b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
147c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
147d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
147e0 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62  if( j==nExpr ) b
147f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14800 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49 54    mCol = MASKBIT
14810 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (j);.           
14820 20 69 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c 55   if( mCol & colU
14830 73 65 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20  sed ) break; /* 
14840 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65 64  Each column used
14850 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20 20   only once */.  
14860 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65            colUse
14870 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20 20  d |= mCol;.     
14880 20 20 20 20 20 20 20 69 66 28 20 61 69 4d 61 70         if( aiMap
14890 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b   ) aiMap[i] = j;
148a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  .          }.  .
148b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
148c0 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63 6f  ( i==nExpr || co
148d0 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42 49 54 28  lUsed!=(MASKBIT(
148e0 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a 20 20 20  nExpr)-1) );.   
148f0 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 55 73         if( colUs
14900 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78  ed==(MASKBIT(nEx
14910 70 72 29 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  pr)-1) ){.      
14920 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
14930 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
14940 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
14950 69 6e 64 65 78 20 70 49 64 78 20 69 73 20 75 73  index pIdx is us
14960 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
14970 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20      int iAddr = 
14980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14990 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
149a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
149b0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 6c              Expl
149c0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
149d0 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  arse, 0,.       
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 20 20 20 20 20 22 55 53 49 4e 47 20 49 4e         "USING IN
14a00 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50  DEX %s FOR IN-OP
14a10 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e  ERATOR",pIdx->zN
14a20 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
14a30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14a40 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
14a50 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
14a60 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
14a70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14a80 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
14a90 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
14ab0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
14ac0 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
14ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
14ae0 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
14af0 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
14b00 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
14b10 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
14b20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
14b30 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64  _INDEX_ASC + pId
14b40 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
14b50 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  ;.  .           
14b60 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
14b70 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  l ){.#ifdef SQLI
14b80 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
14b90 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
14ba0 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61 73           i64 mas
14bb0 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31  k = (1<<nExpr)-1
14bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14bd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14be0 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
14bf0 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20  mnsUsed, .      
14c00 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
14c10 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61  , 0, 0, (u8*)&ma
14c20 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  sk, P4_INT64);.#
14c30 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
14c40 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c      *prRhsHasNul
14c50 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
14c60 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
14c70 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29    if( nExpr==1 )
14c80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
14c90 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e    sqlite3SetHasN
14ca0 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c  ullFlag(v, iTab,
14cb0 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b   *prRhsHasNull);
14cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
14cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
14ce0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14cf0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
14d00 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
14d10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
14d20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* End loop over
14d30 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20   indexes */.    
14d40 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61    } /* End if( a
14d50 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a  ffinity_ok ) */.
14d60 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20      } /* End if 
14d70 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64  not an rowid ind
14d80 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64  ex */.  } /* End
14d90 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69   attempt to opti
14da0 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e  mize using an in
14db0 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  dex */..  /* If 
14dc0 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69  no preexisting i
14dd0 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c  ndex is availabl
14de0 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61  e for the IN cla
14df0 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f  use.  ** and IN_
14e00 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e  INDEX_NOOP is an
14e10 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20   allowed reply. 
14e20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
14e30 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
14e40 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f  or is a list, no
14e50 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a  t a subquery.  *
14e60 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73  * and the RHS is
14e70 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72   not constant or
14e80 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65   has two or fewe
14e90 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68  r terms,.  ** th
14ea0 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72  en it is not wor
14eb0 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65  th creating an e
14ec0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
14ed0 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20  o evaluate.  ** 
14ee0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
14ef0 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  so return IN_IND
14f00 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20  EX_NOOP..  */.  
14f10 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20  if( eType==0.   
14f20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e  && (inFlags & IN
14f30 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a  _INDEX_NOOP_OK).
14f40 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
14f50 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
14f60 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28  sSelect).   && (
14f70 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43  !sqlite3InRhsIsC
14f80 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70  onstant(pX) || p
14f90 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  X->x.pList->nExp
14fa0 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65  r<=2).  ){.    e
14fb0 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
14fc0 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
14fd0 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   eType==0 ){.   
14fe0 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69   /* Could not fi
14ff0 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  nd an existing t
15000 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
15010 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20   use as the RHS 
15020 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57  b-tree..    ** W
15030 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67  e will have to g
15040 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d  enerate an ephem
15050 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f  eral table to do
15060 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f   the job..    */
15070 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e 51  .    u32 savedNQ
15080 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
15090 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
150a0 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e     int rMayHaveN
150b0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79  ull = 0;.    eTy
150c0 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50  pe = IN_INDEX_EP
150d0 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61  H;.    if( inFla
150e0 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  gs & IN_INDEX_LO
150f0 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  OP ){.      pPar
15100 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
15110 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58   0;.      if( pX
15120 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ->pLeft->iColumn
15130 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72  <0 && !ExprHasPr
15140 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
15150 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
15160 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
15170 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NDEX_ROWID;.    
15180 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
15190 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29  ( prRhsHasNull )
151a0 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48 61  {.      *prRhsHa
151b0 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65  sNull = rMayHave
151c0 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
151d0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  >nMem;.    }.   
151e0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
151f0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58  elect(pParse, pX
15200 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20  , rMayHaveNull, 
15210 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
15220 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72  ROWID);.    pPar
15230 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
15240 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
15250 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
15260 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  X->iTable = iTab
15270 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d  ;.  }..  if( aiM
15280 61 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f  ap && eType!=IN_
15290 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
152a0 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44  && eType!=IN_IND
152b0 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b  EX_INDEX_DESC ){
152c0 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
152d0 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78     n = sqlite3Ex
152e0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d  prVectorSize(pX-
152f0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72  >pLeft);.    for
15300 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20  (i=0; i<n; i++) 
15310 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20  aiMap[i] = i;.  
15320 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
15330 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
15340 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15350 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41  SUBQUERY./*.** A
15360 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73  rgument pExpr is
15370 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e   an (?, ?...) IN
15380 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
15390 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
153a0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
153b0 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d  d returns a nul-
153c0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
153d0 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a  g containing .**
153e0 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20   the affinities 
153f0 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
15400 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
15410 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a  e comparison..**
15420 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
15430 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
15440 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
15450 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
15460 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67  turned.** string
15470 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
15480 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
15490 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  e3DbFree()..*/.s
154a0 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72  tatic char *expr
154b0 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  INAffinity(Parse
154c0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
154d0 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a  pExpr){.  Expr *
154e0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
154f0 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  Left;.  int nVal
15500 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
15510 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
15520 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
15530 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61  ct = (pExpr->fla
15540 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
15550 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53  t) ? pExpr->x.pS
15560 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61  elect : 0;.  cha
15570 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65  r *zRet;..  asse
15580 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
15590 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d  K_IN );.  zRet =
155a0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
155b0 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Raw(pParse->db, 
155c0 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a  nVal+1);.  if( z
155d0 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
155e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
155f0 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
15600 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71     Expr *pA = sq
15610 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
15620 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
15630 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 20  );.      char a 
15640 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
15650 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20  inity(pA);.     
15660 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
15670 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
15680 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
15690 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74  Affinity(pSelect
156a0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
156b0 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20  Expr, a);.      
156c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
156d0 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20  Ret[i] = a;.    
156e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52    }.    }.    zR
156f0 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b  et[nVal] = '\0';
15700 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
15710 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  et;.}.#endif..#i
15720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15730 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
15740 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65 20   Load the Parse 
15750 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
15760 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
15770 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ent with an erro
15780 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66  r .** message of
15790 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
157a0 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72     "sub-select r
157b0 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73  eturns N columns
157c0 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a   - expected M".*
157d0 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
157e0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
157f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
15800 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20  nt nActual, int 
15810 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73  nExpect){.  cons
15820 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22  t char *zFmt = "
15830 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
15840 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20  ns %d columns - 
15850 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20  expected %d";.  
15860 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15870 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41  pParse, zFmt, nA
15880 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b  ctual, nExpect);
15890 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
158a0 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   Expression pExp
158b0 72 20 69 73 20 61 20 76 65 63 74 6f 72 20 74 68  r is a vector th
158c0 61 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64  at has been used
158d0 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77 68   in a context wh
158e0 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  ere.** it is not
158f0 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20 70   permitted. If p
15900 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65  Expr is a sub-se
15910 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68 69  lect vector, thi
15920 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f  s routine .** lo
15930 61 64 73 20 74 68 65 20 50 61 72 73 65 20 6f 62  ads the Parse ob
15940 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65 73 73  ject with a mess
15950 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
15960 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
15970 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
15980 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
15990 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  d 1".**.** Or, i
159a0 66 20 69 74 20 69 73 20 61 20 72 65 67 75 6c 61  f it is a regula
159b0 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72 3a  r scalar vector:
159c0 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61  .**.**   "row va
159d0 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20  lue misused".*/ 
159e0 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56    .void sqlite3V
159f0 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50 61  ectorErrorMsg(Pa
15a00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
15a10 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e 64  r *pExpr){.#ifnd
15a20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
15a30 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70 45  UBQUERY.  if( pE
15a40 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
15a50 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  xIsSelect ){.   
15a60 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
15a70 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
15a80 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
15a90 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
15aa0 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  1);.  }else.#end
15ab0 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
15ac0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15ad0 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
15ae0 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  sused");.  }.}..
15af0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
15b00 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
15b10 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
15b20 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70  s a subquery exp
15b30 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c  ression, EXISTS,
15b40 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74  .** or IN operat
15b50 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
15b60 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
15b70 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
15b80 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
15b90 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
15ba0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
15bb0 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
15bc0 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
15bd0 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
15be0 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
15bf0 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
15c00 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
15c10 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
15c20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
15c30 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
15c40 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
15c50 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
15c60 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
15c70 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
15c80 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
15c90 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
15ca0 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
15cb0 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
15cc0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
15cd0 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e  ter isRowid is n
15ce0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78  on-zero, then ex
15cf0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
15d00 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
15d10 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  to be of the for
15d20 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f  m "<rowid> IN (?
15d30 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20  , ?, ?)", where 
15d40 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66  <rowid> is a ref
15d50 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d  erence.** to som
15d60 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f  e integer key co
15d70 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20  lumn of a table 
15d80 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
15d90 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20  case, use an.** 
15da0 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f  intkey B-Tree to
15db0 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
15dc0 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73  f IN(...) values
15dd0 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
15de0 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72  usual.** (slower
15df0 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  ) variable lengt
15e00 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a  h keys B-Tree..*
15e10 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65  *.** If rMayHave
15e20 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Null is non-zero
15e30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
15e40 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  t the operation 
15e50 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74  is an IN.** (not
15e60 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
15e70 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68  STS) and that th
15e80 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74  e RHS might cont
15e90 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41  ains NULLs..** A
15ea0 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
15eb0 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69  does is initiali
15ec0 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ze the register 
15ed0 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76  given by rMayHav
15ee0 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c  eNull.** to NULL
15ef0 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69  .  Calling routi
15f00 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61  nes will take ca
15f10 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74  re of changing t
15f20 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  his register.** 
15f30 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c  value to non-NUL
15f40 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  L if the RHS is 
15f50 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a  NULL-free..**.**
15f60 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72   For a SELECT or
15f70 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
15f80 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67  , return the reg
15f90 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
15fa0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20   the.** result. 
15fb0 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c   For a multi-col
15fc0 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65 20  umn SELECT, the 
15fd0 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
15fe0 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73   in a contiguous
15ff0 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67  .** array of reg
16000 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 72  isters and the r
16010 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
16020 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  he register of t
16030 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20  he left-most.** 
16040 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20  result column.  
16050 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e 20  Return 0 for IN 
16060 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20  operators or if 
16070 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
16080 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
16090 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
160a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
160b0 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72  Subselect(.  Par
160c0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
160d0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
160e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
160f0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
16100 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20       /* The IN, 
16110 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54  SELECT, or EXIST
16120 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  S operator */.  
16130 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  int rHasNullFlag
16140 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ,       /* Regis
16150 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73  ter that records
16160 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65   whether NULLs e
16170 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20  xist in RHS */. 
16180 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20   int isRowid    
16190 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
161a0 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f  rue, LHS of IN o
161b0 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77  perator is a row
161c0 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  id */.){.  int j
161d0 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
161e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
161f0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
16200 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
16210 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
16220 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16240 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67  Register storing
16250 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20   resulting */.  
16260 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
16270 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
16280 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
16290 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
162a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
162b0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
162c0 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61  .  /* The evalua
162d0 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45  tion of the IN/E
162e0 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73  XISTS/SELECT mus
162f0 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76  t be repeated ev
16300 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a  ery time it.  **
16310 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
16320 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
16330 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
16340 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
16350 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
16360 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
16370 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
16380 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
16390 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
163a0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
163b0 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
163c0 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
163d0 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
163e0 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
163f0 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
16400 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
16410 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
16420 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
16430 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
16440 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
16450 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
16460 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
16470 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
16480 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
16490 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
164a0 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
164b0 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49  ect) ){.    jmpI
164c0 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74  fDynamic = sqlit
164d0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
164e0 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
164f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
16500 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
16510 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
16520 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
16530 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
16540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
16550 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
16560 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
16570 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ction */.      E
16580 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
16590 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68  pr->pLeft; /* th
165a0 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
165b0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
165c0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
165d0 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  nfo = 0;      /*
165e0 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   Key information
165f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56   */.      int nV
16600 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
16610 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
16620 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f   vector pLeft */
16630 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 56  .      .      nV
16640 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
16650 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
16660 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16670 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61   !isRowid || nVa
16680 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  l==1 );..      /
16690 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69  * Whether this i
166a0 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43  s an 'x IN(SELEC
166b0 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20  T...)' or an 'x 
166c0 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a  IN(<exprlist>)'.
166d0 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
166e0 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65  ion it is handle
166f0 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20  d the same way. 
16700 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   An ephemeral ta
16710 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  ble is .      **
16720 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e 64   filled with ind
16730 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e  ex keys represen
16740 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
16750 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
16760 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74 68   ** SELECT or th
16770 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
16780 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
16790 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
167a0 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
167b0 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
167c0 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
167d0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
167e0 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
167f0 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
16800 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
16810 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
16820 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
16830 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
16840 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
16850 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
16860 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
16870 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
16880 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
16890 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
168a0 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
168b0 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
168c0 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
168d0 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
168e0 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
168f0 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
16900 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
16910 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
16920 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
16930 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
16940 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
16950 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
16960 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
16970 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
16980 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16990 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
169a0 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 45  l, .          pE
169b0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73  xpr->iTable, (is
169c0 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a  Rowid?0:nVal));.
169d0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
169e0 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73   isRowid ? 0 : s
169f0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
16a00 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
16a10 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  Val, 1);..      
16a20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
16a30 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
16a40 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
16a50 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
16a60 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
16a70 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
16a80 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
16a90 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
16aa0 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
16ab0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
16ac0 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
16ad0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
16ae0 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
16af0 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
16b00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16b10 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
16b20 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  t = pExpr->x.pSe
16b30 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 45 78  lect;.        Ex
16b40 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
16b50 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
16b60 3b 0a 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61  ;..        Expla
16b70 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
16b80 72 73 65 2c 20 31 2c 20 22 25 73 4c 49 53 54 20  rse, 1, "%sLIST 
16b90 53 55 42 51 55 45 52 59 22 2c 0a 20 20 20 20 20  SUBQUERY",.     
16ba0 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
16bb0 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45  mic>=0?"":"CORRE
16bc0 4c 41 54 45 44 20 22 0a 20 20 20 20 20 20 20 20  LATED ".        
16bd0 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
16be0 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
16bf0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
16c00 65 20 4c 48 53 20 61 6e 64 20 52 48 53 20 6f 66  e LHS and RHS of
16c10 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
16c20 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74   do not match, t
16c30 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  hat.        ** e
16c40 72 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62  rror will have b
16c50 65 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20  een caught long 
16c60 62 65 66 6f 72 65 20 77 65 20 72 65 61 63 68 20  before we reach 
16c70 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20  this point. */. 
16c80 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59         if( ALWAY
16c90 53 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  S(pEList->nExpr=
16ca0 3d 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  =nVal) ){.      
16cb0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
16cc0 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  est;.          i
16cd0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
16ce0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
16cf0 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
16d00 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
16d10 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ble);.          
16d20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20  dest.zAffSdst = 
16d30 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70  exprINAffinity(p
16d40 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
16d50 20 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74           pSelect
16d60 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
16d70 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
16d80 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ( pSelect->selFl
16d90 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
16da0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  t );.          t
16db0 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66  estcase( pKeyInf
16dc0 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65  o==0 ); /* Cause
16dd0 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69  d by OOM in sqli
16de0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
16df0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  ) */.          i
16e00 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
16e10 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
16e20 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
16e30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
16e40 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
16e50 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29  , dest.zAffSdst)
16e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
16e70 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
16e80 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  f(pKeyInfo);.   
16e90 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16ea0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
16eb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16ec0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
16ed0 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74  b, dest.zAffSdst
16ee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
16ef0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ert( pKeyInfo!=0
16f00 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20   ); /* OOM will 
16f10 63 61 75 73 65 20 65 78 69 74 20 61 66 74 65 72  cause exit after
16f20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
16f30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
16f40 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
16f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
16f60 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
16f70 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  pr>0 );.        
16f80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16f90 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
16fa0 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b  ble(pKeyInfo) );
16fb0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
16fc0 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29  =0; i<nVal; i++)
16fd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
16fe0 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56  pr *p = sqlite3V
16ff0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
17000 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
17010 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
17020 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  o->aColl[i] = sq
17030 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
17040 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20  reCollSeq(.     
17050 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
17060 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  e, p, pEList->a[
17070 69 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20  i].pExpr.       
17080 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
17090 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
170a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
170b0 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
170c0 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
170d0 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
170e0 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
170f0 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
17100 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65          ** For e
17110 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
17120 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
17130 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
17140 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
17150 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
17160 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
17170 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
17180 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
17190 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
171a0 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
171b0 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
171c0 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
171d0 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
171e0 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
171f0 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
17200 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
17210 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17220 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
17230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
17240 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48  finity of the LH
17250 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20  S of the IN */. 
17260 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
17270 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
17280 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
17290 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  .pList;.        
172a0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
172b0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
172c0 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c       int r1, r2,
172d0 20 72 33 3b 0a 20 20 20 20 20 20 20 20 61 66 66   r3;.        aff
172e0 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
172f0 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
17300 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
17310 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
17320 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
17330 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
17340 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  B;.        }.   
17350 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
17360 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  o ){.          a
17370 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
17380 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
17390 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20  (pKeyInfo) );.  
173a0 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
173b0 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c  ->aColl[0] = sql
173c0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
173d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
173e0 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Left);.        }
173f0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
17400 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
17410 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
17420 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
17430 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
17440 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
17450 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
17460 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17470 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17480 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
17490 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
174a0 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
174b0 30 2c 20 72 32 2c 20 30 2c 20 22 22 2c 20 50 34  0, r2, 0, "", P4
174c0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
174d0 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
174e0 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
174f0 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
17500 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
17510 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
17520 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
17530 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
17540 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
17550 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
17560 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
17570 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
17580 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
17590 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
175a0 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
175b0 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
175c0 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
175d0 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
175e0 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
175f0 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
17600 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
17610 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
17620 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
17630 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
17640 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
17650 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
17660 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
17670 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
17680 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
17690 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
176a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
176b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
176c0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49  geToNoop(v, jmpI
176d0 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20  fDynamic);.     
176e0 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
176f0 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mic = -1;.      
17700 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
17710 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
17720 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
17730 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
17740 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
17750 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
17760 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65  sRowid && sqlite
17770 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
17780 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20  E2, &iValToIns) 
17790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
177a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
177b0 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74  (v, OP_InsertInt
177c0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
177d0 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b   r2, iValToIns);
177e0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
177f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33  {.            r3
17800 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17810 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
17820 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
17830 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
17840 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
17850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17860 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
17870 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20  BeInt, r3,.     
17880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17890 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
178a0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
178b0 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
178c0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
178d0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
178e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
178f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
17900 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
17910 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20  ble, r2, r3);.  
17920 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
17930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
17940 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17950 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
17960 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
17970 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
17980 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17990 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
179a0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
179b0 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r3, 1);.      
179c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
179d0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
179e0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45  OP_IdxInsert, pE
179f0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
17a00 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r3, 1);.       
17a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17a20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17a30 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
17a40 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17a50 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
17a60 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17a70 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
17a80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17a90 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
17aa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17ab0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
17ac0 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b  addr, (void *)pK
17ad0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
17ae0 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
17af0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17b00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
17b10 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
17b20 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66  _SELECT:.    def
17b30 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
17b40 20 43 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c   Case 3:    (SEL
17b50 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e  ECT ... FROM ...
17b60 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f  ).      **     o
17b70 72 3a 20 20 20 20 45 58 49 53 54 53 28 53 45 4c  r:    EXISTS(SEL
17b80 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e  ECT ... FROM ...
17b90 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ).      **.     
17ba0 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54   ** For a SELECT
17bb0 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
17bc0 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75 65  to put the value
17bd0 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  s for all column
17be0 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  s of.      ** th
17bf0 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f  e first row into
17c00 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
17c10 69 73 74 65 72 73 20 61 6e 64 20 72 65 74 75 72  isters and retur
17c20 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20  n the index of. 
17c30 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73       ** the firs
17c40 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20  t register..    
17c50 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
17c60 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53   this is an EXIS
17c70 54 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74  TS, write an int
17c80 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73  eger 0 (not exis
17c90 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73  ts) or 1 (exists
17ca0 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ).      ** into 
17cb0 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 72  a register and r
17cc0 65 74 75 72 6e 20 74 68 61 74 20 72 65 67 69 73  eturn that regis
17cd0 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20  ter number..    
17ce0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e    **.      ** In
17cf0 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65   both cases, the
17d00 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e   query is augmen
17d10 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20  ted with "LIMIT 
17d20 31 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20  1".  Any .      
17d30 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c  ** preexisting l
17d40 69 6d 69 74 20 69 73 20 64 69 73 63 61 72 64 65  imit is discarde
17d50 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  d in place of th
17d60 65 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20  e new LIMIT 1.. 
17d70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65       */.      Se
17d80 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17da0 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
17db0 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64  atement to encod
17dc0 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  e */.      Selec
17dd0 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17df0 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20   /* How to deal 
17e00 77 69 74 68 20 53 45 4c 45 43 54 20 72 65 73 75  with SELECT resu
17e10 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
17e20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e40 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74    /* Registers t
17e50 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
17e60 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
17e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
17e90 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f   limit expressio
17ea0 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  n */..      test
17eb0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
17ec0 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
17ed0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
17ee0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
17ef0 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
17f00 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
17f10 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
17f20 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
17f30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17f40 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
17f50 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
17f60 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20 20 20  elect) );..     
17f70 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
17f80 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
17f90 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
17fa0 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73  ((pParse, 1, "%s
17fb0 53 43 41 4c 41 52 20 53 55 42 51 55 45 52 59 22  SCALAR SUBQUERY"
17fc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  ,.            jm
17fd0 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22  pIfDynamic>=0?""
17fe0 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 29 29  :"CORRELATED "))
17ff0 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70  ;.      nReg = p
18000 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
18010 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69  ECT ? pSel->pELi
18020 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20  st->nExpr : 1;. 
18030 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
18040 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
18050 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 0, pParse->nMe
18060 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  m+1);.      pPar
18070 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
18080 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
18090 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
180a0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74   ){.        dest
180b0 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d  .eDest = SRT_Mem
180c0 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69  ;.        dest.i
180d0 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50  Sdst = dest.iSDP
180e0 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73  arm;.        des
180f0 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a  t.nSdst = nReg;.
18100 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18110 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
18120 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53  Null, 0, dest.iS
18130 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50  DParm, dest.iSDP
18140 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20  arm+nReg-1);.   
18150 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
18160 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
18170 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
18180 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18190 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
181a0 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
181b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
181c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
181d0 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53  eger, 0, dest.iS
181e0 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  DParm);.        
181f0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
18200 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
18210 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
18220 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 73        pLimit = s
18230 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
18240 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49  pParse->db, TK_I
18250 4e 54 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49  NTEGER,&sqlite3I
18260 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b  ntTokens[1], 0);
18270 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d  .      if( pSel-
18280 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
18290 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
182a0 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
182b0 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70   pSel->pLimit->p
182c0 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Left);.        p
182d0 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65  Sel->pLimit->pLe
182e0 66 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  ft = pLimit;.   
182f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18300 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
18310 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
18320 61 72 73 65 2c 20 54 4b 5f 4c 49 4d 49 54 2c 20  arse, TK_LIMIT, 
18330 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20  pLimit, 0);.    
18340 20 20 7d 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e    }.      pSel->
18350 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
18360 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
18370 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
18380 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
18390 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
183a0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67      }.      rReg
183b0 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
183c0 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56  .      ExprSetVV
183d0 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
183e0 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
183f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18400 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61  }.  }..  if( rHa
18410 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20  sNullFlag ){.   
18420 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75   sqlite3SetHasNu
18430 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d  llFlag(v, pExpr-
18440 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c  >iTable, rHasNul
18450 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69  lFlag);.  }..  i
18460 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
18470 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
18480 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
18490 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a   jmpIfDynamic);.
184a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
184b0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
184c0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65  );..  return rRe
184d0 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  g;.}.#endif /* S
184e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
184f0 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
18500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
18510 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20  UERY./*.** Expr 
18520 70 49 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e  pIn is an IN(...
18530 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68  ) expression. Th
18540 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
18550 6b 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ks that the .** 
18560 73 75 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68  sub-select on th
18570 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28  e RHS of the IN(
18580 29 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20 74  ) operator has t
18590 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
185a0 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73  f .** columns as
185b0 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74   the vector on t
185c0 68 65 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74  he LHS. Or, if t
185d0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
185e0 28 29 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20  () is not .** a 
185f0 73 75 62 2d 71 75 65 72 79 2c 20 74 68 61 74 20  sub-query, that 
18600 74 68 65 20 4c 48 53 20 69 73 20 61 20 76 65 63  the LHS is a vec
18610 74 6f 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a  tor of size 1..*
18620 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
18630 72 43 68 65 63 6b 49 4e 28 50 61 72 73 65 20 2a  rCheckIN(Parse *
18640 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 49  pParse, Expr *pI
18650 6e 29 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f  n){.  int nVecto
18660 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  r = sqlite3ExprV
18670 65 63 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70  ectorSize(pIn->p
18680 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 28 70 49  Left);.  if( (pI
18690 6e 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  n->flags & EP_xI
186a0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
186b0 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 70 49 6e  if( nVector!=pIn
186c0 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
186d0 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
186e0 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65      sqlite3Subse
186f0 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
18700 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74  , pIn->x.pSelect
18710 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
18720 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 20   nVector);.     
18730 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
18740 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65  .  }else if( nVe
18750 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20 73  ctor!=1 ){.    s
18760 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f  qlite3VectorErro
18770 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 49 6e  rMsg(pParse, pIn
18780 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 72 65  ->pLeft);.    re
18790 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
187a0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
187b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
187c0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
187d0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
187e0 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70  de for an IN exp
187f0 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  ression..**.**  
18800 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
18810 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20   ...).**      x 
18820 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
18830 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  , ...).**.** The
18840 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
18850 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c 61  (LHS) is a scala
18860 72 20 6f 72 20 76 65 63 74 6f 72 20 65 78 70 72  r or vector expr
18870 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a  ession.  The .**
18880 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
18890 20 28 52 48 53 29 20 69 73 20 61 6e 20 61 72 72   (RHS) is an arr
188a0 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ay of zero or mo
188b0 72 65 20 73 63 61 6c 61 72 20 76 61 6c 75 65 73  re scalar values
188c0 2c 20 6f 72 20 61 0a 2a 2a 20 73 75 62 71 75 65  , or a.** subque
188d0 72 79 2e 20 20 49 66 20 74 68 65 20 52 48 53 20  ry.  If the RHS 
188e0 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
188f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
18900 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74  ult columns must
18910 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 75  .** match the nu
18920 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
18930 69 6e 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e  in the vector on
18940 20 74 68 65 20 4c 48 53 2e 20 20 49 66 20 74 68   the LHS.  If th
18950 65 20 52 48 53 20 69 73 0a 2a 2a 20 61 20 6c 69  e RHS is.** a li
18960 73 74 20 6f 66 20 76 61 6c 75 65 73 2c 20 74 68  st of values, th
18970 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20 61 20  e LHS must be a 
18980 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54  scalar. .**.** T
18990 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
189a0 73 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48  s true if the LH
189b0 53 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 74 61  S value is conta
189c0 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
189d0 52 48 53 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75  RHS..** The resu
189e0 6c 74 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  lt is false if t
189f0 68 65 20 4c 48 53 20 69 73 20 64 65 66 69 6e 69  he LHS is defini
18a00 74 65 6c 79 20 6e 6f 74 20 69 6e 20 74 68 65 20  tely not in the 
18a10 52 48 53 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65  RHS.  The .** re
18a20 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20  sult is NULL if 
18a30 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
18a40 74 68 65 20 4c 48 53 20 69 6e 20 74 68 65 20 52  the LHS in the R
18a50 48 53 20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a  HS cannot be .**
18a60 20 64 65 74 65 72 6d 69 6e 65 64 20 64 75 65 20   determined due 
18a70 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20  to NULLs..**.** 
18a80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
18a90 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
18aa0 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66   jumps to destIf
18ab0 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53  False if the LHS
18ac0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74   is not .** cont
18ad0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
18ae0 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f   RHS.  If due to
18af0 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74   NULLs we cannot
18b00 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
18b10 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74  e LHS.** is cont
18b20 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
18b30 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65   then jump to de
18b40 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
18b50 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e  e LHS is contain
18b60 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
18b70 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74   RHS then fall t
18b80 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65  hrough..**.** Se
18b90 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20 69  e the separate i
18ba0 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 64 6f  n-operator.md do
18bb0 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65  cumentation file
18bc0 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   in the canonica
18bd0 6c 0a 2a 2a 20 53 51 4c 69 74 65 20 73 6f 75 72  l.** SQLite sour
18be0 63 65 20 74 72 65 65 20 66 6f 72 20 61 64 64 69  ce tree for addi
18bf0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
18c00 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
18c10 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
18c20 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70  deIN(.  Parse *p
18c30 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
18c40 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
18c50 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
18c60 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
18c70 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
18c80 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65 73  /* The IN expres
18c90 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
18ca0 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20  stIfFalse,      
18cb0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
18cc0 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
18cd0 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20  ined in the RHS 
18ce0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e  */.  int destIfN
18cf0 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ull        /* Ju
18d00 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 72  mp here if the r
18d10 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f  esults are unkno
18d20 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  wn due to NULLs 
18d30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73  */.){.  int rRhs
18d40 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a  HasNull = 0;  /*
18d50 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20 69   Register that i
18d60 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63 6f  s true if RHS co
18d70 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
18d80 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  es */.  int eTyp
18d90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
18da0 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48 53   Type of the RHS
18db0 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 3b 20   */.  int rLhs; 
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18dd0 65 67 69 73 74 65 72 28 73 29 20 68 6f 6c 64 69  egister(s) holdi
18de0 6e 67 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65  ng the LHS value
18df0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 4f  s */.  int rLhsO
18e00 72 69 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rig;         /* 
18e10 4c 48 53 20 76 61 6c 75 65 73 20 70 72 69 6f 72  LHS values prior
18e20 20 74 6f 20 72 65 6f 72 64 65 72 69 6e 67 20 62   to reordering b
18e30 79 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56  y aiMap[] */.  V
18e40 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
18e50 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
18e60 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
18e70 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  tion */.  int *a
18e80 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  iMap = 0;       
18e90 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65 63 74  /* Map from vect
18ea0 6f 72 20 66 69 65 6c 64 20 74 6f 20 69 6e 64 65  or field to inde
18eb0 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  x column */.  ch
18ec0 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20  ar *zAff = 0;   
18ed0 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
18ee0 73 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61  string for compa
18ef0 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  risons */.  int 
18f00 6e 56 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20  nVector;        
18f10 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63    /* Size of vec
18f20 74 6f 72 73 20 66 6f 72 20 74 68 69 73 20 49 4e  tors for this IN
18f30 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
18f40 6e 74 20 69 44 75 6d 6d 79 3b 20 20 20 20 20 20  nt iDummy;      
18f50 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61       /* Dummy pa
18f60 72 61 6d 65 74 65 72 20 74 6f 20 65 78 70 72 43  rameter to exprC
18f70 6f 64 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20  odeVector() */. 
18f80 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20   Expr *pLeft;   
18f90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48         /* The LH
18fa0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
18fb0 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ator */.  int i;
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* loop counter 
18fe0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65  */.  int destSte
18ff0 70 32 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68  p2;        /* Wh
19000 65 72 65 20 74 6f 20 6a 75 6d 70 20 77 68 65 6e  ere to jump when
19010 20 4e 55 4c 4c 73 20 73 65 65 6e 20 69 6e 20 73   NULLs seen in s
19020 74 65 70 20 32 20 2a 2f 0a 20 20 69 6e 74 20 64  tep 2 */.  int d
19030 65 73 74 53 74 65 70 36 20 3d 20 30 3b 20 20 20  estStep6 = 0;   
19040 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64   /* Start of cod
19050 65 20 66 6f 72 20 53 74 65 70 20 36 20 2a 2f 0a  e for Step 6 */.
19060 20 20 69 6e 74 20 61 64 64 72 54 72 75 74 68 4f    int addrTruthO
19070 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  p;      /* Addre
19080 73 73 20 6f 66 20 6f 70 63 6f 64 65 20 74 68 61  ss of opcode tha
19090 74 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  t determines the
190a0 20 49 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20   IN is true */. 
190b0 20 69 6e 74 20 64 65 73 74 4e 6f 74 4e 75 6c 6c   int destNotNull
190c0 3b 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ;      /* Jump h
190d0 65 72 65 20 69 66 20 61 20 63 6f 6d 70 61 72 69  ere if a compari
190e0 73 6f 6e 20 69 73 20 6e 6f 74 20 74 72 75 65 20  son is not true 
190f0 69 6e 20 73 74 65 70 20 36 20 2a 2f 0a 20 20 69  in step 6 */.  i
19100 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
19110 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
19120 68 65 20 73 74 65 70 2d 36 20 6c 6f 6f 70 20 2a  he step-6 loop *
19130 2f 20 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70 45  / ..  pLeft = pE
19140 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 66  xpr->pLeft;.  if
19150 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  ( sqlite3ExprChe
19160 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  ckIN(pParse, pEx
19170 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pr) ) return;.  
19180 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66 66  zAff = exprINAff
19190 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45  inity(pParse, pE
191a0 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72 20  xpr);.  nVector 
191b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
191c0 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70  torSize(pExpr->p
191d0 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20 3d  Left);.  aiMap =
191e0 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62   (int*)sqlite3Db
191f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
19200 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56    pParse->db, nV
19210 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69 6e  ector*(sizeof(in
19220 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72  t) + sizeof(char
19230 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69 66  )) + 1.  );.  if
19240 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
19250 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
19260 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  o sqlite3ExprCod
19270 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a 0a  eIN_oom_error;..
19280 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
19290 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e  compute the RHS.
192a0 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65 70   After this step
192b0 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f 74  , if anything ot
192c0 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49 4e  her than.  ** IN
192d0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
192e0 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61 62  eturned, the tab
192f0 6c 65 20 6f 70 65 6e 65 64 20 69 74 68 20 63 75  le opened ith cu
19300 72 73 6f 72 20 70 45 78 70 72 2d 3e 69 54 61 62  rsor pExpr->iTab
19310 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  le .  ** contain
19320 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61  s the values tha
19330 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48  t make up the RH
19340 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e  S. If IN_INDEX_N
19350 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c  OOP is returned,
19360 0a 20 20 2a 2a 20 74 68 65 20 52 48 53 20 68 61  .  ** the RHS ha
19370 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  s not yet been c
19380 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20  oded.  */.  v = 
19390 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
193a0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
193b0 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65         /* OOM de
193c0 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20  tected prior to 
193d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
193e0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
193f0 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20  t((v, "begin IN 
19400 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65  expr"));.  eType
19410 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
19420 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45  Index(pParse, pE
19430 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19450 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45    IN_INDEX_MEMBE
19460 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58  RSHIP | IN_INDEX
19470 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20  _NOOP_OK,.      
19480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19490 20 20 20 20 20 20 20 64 65 73 74 49 66 46 61 6c         destIfFal
194a0 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f  se==destIfNull ?
194b0 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c   0 : &rRhsHasNul
194c0 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a 20 20 61 73  l, aiMap);..  as
194d0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
194e0 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31  rr || nVector==1
194f0 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
19500 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20 20 7c  DEX_EPH.       |
19510 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  | eType==IN_INDE
19520 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65  X_INDEX_ASC || e
19530 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
19540 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a  NDEX_DESC .  );.
19550 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
19560 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72 6d  BUG.  /* Confirm
19570 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20 63 6f   that aiMap[] co
19580 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72 20 69  ntains nVector i
19590 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 62 65  nteger values be
195a0 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a 2a  tween 0 and.  **
195b0 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20   nVector-1. */. 
195c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
195d0 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  tor; i++){.    i
195e0 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20 66  nt j, cnt;.    f
195f0 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56  or(cnt=j=0; j<nV
19600 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28 20  ector; j++) if( 
19610 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e  aiMap[j]==i ) cn
19620 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t++;.    assert(
19630 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23   cnt==1 );.  }.#
19640 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64 65  endif..  /* Code
19650 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65   the LHS, the <e
19660 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72  xpr> from "<expr
19670 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20  > IN (...)". If 
19680 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20  the LHS is a .  
19690 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20  ** vector, then 
196a0 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  it is stored in 
196b0 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63  an array of nVec
196c0 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 73 74  tor registers st
196d0 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20  arting .  ** at 
196e0 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 71  r1..  **.  ** sq
196f0 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
19700 28 29 20 6d 69 67 68 74 20 68 61 76 65 20 72 65  () might have re
19710 6f 72 64 65 72 65 64 20 74 68 65 20 66 69 65 6c  ordered the fiel
19720 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20 76 65  ds of the LHS ve
19730 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68 61  ctor.  ** so tha
19740 74 20 74 68 65 20 66 69 65 6c 64 73 20 61 72 65  t the fields are
19750 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64   in the same ord
19760 65 72 20 61 73 20 61 6e 20 65 78 69 73 74 69 6e  er as an existin
19770 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65 0a 20  g index.   The. 
19780 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72 61   ** aiMap[] arra
19790 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 70  y contains a map
197a0 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f 72  ping from the or
197b0 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c 64  iginal LHS field
197c0 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 74   order to.  ** t
197d0 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74  he field order t
197e0 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
197f0 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a  RHS index..  */.
19800 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19810 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
19820 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65 78 70    rLhsOrig = exp
19830 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72  rCodeVector(pPar
19840 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d  se, pLeft, &iDum
19850 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  my);.  for(i=0; 
19860 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61 69 4d  i<nVector && aiM
19870 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d  ap[i]==i; i++){}
19880 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69 65 6c   /* Are LHS fiel
19890 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20 2a 2f  ds reordered? */
198a0 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63 74 6f  .  if( i==nVecto
198b0 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53 20  r ){.    /* LHS 
198c0 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 72  fields are not r
198d0 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20  eordered */.    
198e0 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69 67 3b  rLhs = rLhsOrig;
198f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19900 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64 65 72   Need to reorder
19910 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64 73 20   the LHS fields 
19920 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 69 4d  according to aiM
19930 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d  ap */.    rLhs =
19940 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
19950 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65  ange(pParse, nVe
19960 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69  ctor);.    for(i
19970 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
19980 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
19990 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
199a0 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72 69  OP_Copy, rLhsOri
199b0 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70 5b  g+i, rLhs+aiMap[
199c0 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  i], 0);.    }.  
199d0 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74  }..  /* If sqlit
199e0 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20  e3FindInIndex() 
199f0 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20  did not find or 
19a00 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20  create an index 
19a10 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69  that is.  ** sui
19a20 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61  table for evalua
19a30 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72  ting the IN oper
19a40 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75  ator, then evalu
19a50 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a  ate using a.  **
19a60 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d   sequence of com
19a70 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20  parisons..  **. 
19a80 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74 65 70   ** This is step
19a90 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e 2d 6f   (1) in the in-o
19aa0 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69 6d  perator.md optim
19ab0 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e 0a  ized algorithm..
19ac0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
19ad0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  ==IN_INDEX_NOOP 
19ae0 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
19af0 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
19b00 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c  x.pList;.    Col
19b10 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
19b20 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
19b30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
19b40 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20  pLeft);.    int 
19b50 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65  labelOk = sqlite
19b60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
19b70 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72  );.    int r2, r
19b80 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e  egToFree;.    in
19b90 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b  t regCkNull = 0;
19ba0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
19bb0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
19bc0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
19bd0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
19be0 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66  ;.    if( destIf
19bf0 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73  Null!=destIfFals
19c00 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b  e ){.      regCk
19c10 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Null = sqlite3Ge
19c20 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
19c30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19c40 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19c50 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72 4c  BitAnd, rLhs, rL
19c60 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  hs, regCkNull);.
19c70 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
19c80 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  =0; ii<pList->nE
19c90 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
19ca0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
19cb0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19cc0 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  e, pList->a[ii].
19cd0 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65  pExpr, &regToFre
19ce0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  e);.      if( re
19cf0 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74  gCkNull && sqlit
19d00 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
19d10 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78  pList->a[ii].pEx
19d20 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
19d30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19d40 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72  (v, OP_BitAnd, r
19d50 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65  egCkNull, r2, re
19d60 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  gCkNull);.      
19d70 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c 70  }.      if( ii<p
19d80 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c  List->nExpr-1 ||
19d90 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73   destIfNull!=des
19da0 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
19db0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19dc0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp4(v, OP_Eq, 
19dd0 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72  rLhs, labelOk, r
19de0 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
19e00 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  id*)pColl, P4_CO
19e10 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20  LLSEQ);.        
19e20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
19e30 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  , ii<pList->nExp
19e40 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  r-1);.        Vd
19e50 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
19e60 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ii==pList->nExpr
19e70 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  -1);.        sql
19e80 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
19e90 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20  (v, zAff[0]);.  
19ea0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19eb0 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49     assert( destI
19ec0 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c  fNull==destIfFal
19ed0 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  se );.        sq
19ee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
19ef0 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c 20  v, OP_Ne, rLhs, 
19f00 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c  destIfFalse, r2,
19f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
19f30 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
19f40 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61  SEQ); VdbeCovera
19f50 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
19f60 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
19f70 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20  P5(v, zAff[0] | 
19f80 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
19f90 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  L);.      }.    
19fa0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19fb0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19fc0 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  regToFree);.    
19fd0 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e  }.    if( regCkN
19fe0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ull ){.      sql
19ff0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a000 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
1a010 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75  CkNull, destIfNu
1a020 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ll); VdbeCoverag
1a030 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
1a040 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
1a050 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
1a060 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1a070 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a080 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20  , labelOk);.    
1a090 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a0a0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1a0b0 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67 6f  gCkNull);.    go
1a0c0 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  to sqlite3ExprCo
1a0d0 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  deIN_finished;. 
1a0e0 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32 3a   }..  /* Step 2:
1a0f0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1a100 20 74 68 65 20 4c 48 53 20 63 6f 6e 74 61 69 6e   the LHS contain
1a110 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d  s any NULL colum
1a120 6e 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  ns.  If the.  **
1a130 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74 61 69   LHS does contai
1a140 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68 65  n NULLs then the
1a150 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
1a160 65 69 74 68 65 72 20 46 41 4c 53 45 20 6f 72 20  either FALSE or 
1a170 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77 69  NULL..  ** We wi
1a180 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  ll then skip the
1a190 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f   binary search o
1a1a0 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a  f the RHS..  */.
1a1b0 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c    if( destIfNull
1a1c0 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  ==destIfFalse ){
1a1d0 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d  .    destStep2 =
1a1e0 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20   destIfFalse;.  
1a1f0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 53  }else{.    destS
1a200 74 65 70 32 20 3d 20 64 65 73 74 53 74 65 70 36  tep2 = destStep6
1a210 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1a220 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 0a  keLabel(v);.  }.
1a230 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
1a240 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
1a250 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
1a260 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
1a270 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  xpr(pExpr->pLeft
1a280 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71  , i);.    if( sq
1a290 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
1a2a0 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73  ll(p) ){.      s
1a2b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a2c0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
1a2d0 4c 68 73 2b 69 2c 20 64 65 73 74 53 74 65 70 32  Lhs+i, destStep2
1a2e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1a2f0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
1a300 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33    }..  /* Step 3
1a310 2e 20 20 54 68 65 20 4c 48 53 20 69 73 20 6e 6f  .  The LHS is no
1a320 77 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f  w known to be no
1a330 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20  n-NULL.  Do the 
1a340 62 69 6e 61 72 79 20 73 65 61 72 63 68 0a 20 20  binary search.  
1a350 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 20 75 73  ** of the RHS us
1a360 69 6e 67 20 74 68 65 20 4c 48 53 20 61 73 20 61  ing the LHS as a
1a370 20 70 72 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e   probe.  If foun
1a380 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  d, the result is
1a390 0a 20 20 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f  .  ** true..  */
1a3a0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e  .  if( eType==IN
1a3b0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
1a3c0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
1a3d0 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20  ase, the RHS is 
1a3e0 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62  the ROWID of tab
1a3f0 6c 65 20 62 2d 74 72 65 65 20 61 6e 64 20 73 6f  le b-tree and so
1a400 20 77 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20   we also.    ** 
1a410 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 52 48  know that the RH
1a420 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20  S is non-NULL.  
1a430 48 65 6e 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e  Hence, we combin
1a440 65 20 73 74 65 70 73 20 33 20 61 6e 64 20 34 0a  e steps 3 and 4.
1a450 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69      ** into a si
1a460 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  ngle opcode. */.
1a470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a480 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp3(v, OP_Seek
1a490 52 6f 77 69 64 2c 20 70 45 78 70 72 2d 3e 69 54  Rowid, pExpr->iT
1a4a0 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
1a4b0 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20 56 64  e, rLhs);.    Vd
1a4c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a4d0 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d     addrTruthOp =
1a4e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a4f0 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20  p0(v, OP_Goto); 
1a500 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20   /* Return True 
1a510 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
1a520 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a530 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  4(v, OP_Affinity
1a540 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c  , rLhs, nVector,
1a550 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f   0, zAff, nVecto
1a560 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74  r);.    if( dest
1a570 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
1a580 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ull ){.      /* 
1a590 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33 20 61  Combine Step 3 a
1a5a0 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f 20 61  nd Step 5 into a
1a5b0 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a   single opcode *
1a5c0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
1a5d0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1a5e0 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78  OP_NotFound, pEx
1a5f0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
1a600 49 66 46 61 6c 73 65 2c 0a 20 20 20 20 20 20 20  IfFalse,.       
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f      rLhs, nVecto
1a630 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
1a640 28 76 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  (v);.      goto 
1a650 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1a660 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  N_finished;.    
1a670 7d 0a 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61 72  }.    /* Ordinar
1a680 79 20 53 74 65 70 20 33 2c 20 66 6f 72 20 74 68  y Step 3, for th
1a690 65 20 63 61 73 65 20 77 68 65 72 65 20 46 41 4c  e case where FAL
1a6a0 53 45 20 61 6e 64 20 4e 55 4c 4c 20 61 72 65 20  SE and NULL are 
1a6b0 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 20 20  distinct */.    
1a6c0 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71  addrTruthOp = sq
1a6d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
1a6e0 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
1a6f0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
1a700 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a720 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56          rLhs, nV
1a730 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65  ector); VdbeCove
1a740 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
1a750 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66 20 74  /* Step 4.  If t
1a760 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20  he RHS is known 
1a770 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  to be non-NULL a
1a780 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69  nd we did not fi
1a790 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68  nd.  ** an match
1a7a0 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 20 61   on the search a
1a7b0 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
1a7c0 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41  esult must be FA
1a7d0 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  LSE..  */.  if( 
1a7e0 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e  rRhsHasNull && n
1a7f0 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20  Vector==1 ){.   
1a800 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a810 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p2(v, OP_NotNull
1a820 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64  , rRhsHasNull, d
1a830 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
1a840 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a850 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  ;.  }..  /* Step
1a860 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f   5.  If we do no
1a870 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
1a880 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
1a890 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a  een NULL and.  *
1a8a0 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75  * FALSE, then ju
1a8b0 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  st return false.
1a8c0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73   .  */.  if( des
1a8d0 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
1a8e0 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64  Null ) sqlite3Vd
1a8f0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66  beGoto(v, destIf
1a900 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74  False);..  /* St
1a910 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75  ep 6: Loop throu
1a920 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52  gh rows of the R
1a930 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63  HS.  Compare eac
1a940 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53  h row to the LHS
1a950 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f  ..  ** If any co
1a960 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c  mparison is NULL
1a970 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
1a980 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61  t is NULL.  If a
1a990 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73  ll.  ** comparis
1a9a0 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20 74 68  ons are FALSE th
1a9b0 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73  en the final res
1a9c0 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20  ult is FALSE..  
1a9d0 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63  **.  ** For a sc
1a9e0 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20  alar LHS, it is 
1a9f0 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68  sufficient to ch
1aa00 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72  eck just the fir
1aa10 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74  st row.  ** of t
1aa20 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69  he RHS..  */.  i
1aa30 66 28 20 64 65 73 74 53 74 65 70 36 20 29 20 73  f( destStep6 ) s
1aa40 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1aa50 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74  eLabel(v, destSt
1aa60 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20  ep6);.  addrTop 
1aa70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1aa80 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
1aa90 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1aaa0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1aab0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1aac0 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e  ;.  if( nVector>
1aad0 31 20 29 7b 0a 20 20 20 20 64 65 73 74 4e 6f 74  1 ){.    destNot
1aae0 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
1aaf0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1ab00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1ab10 46 6f 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20  For nVector==1, 
1ab20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 36 20  combine steps 6 
1ab30 61 6e 64 20 37 20 62 79 20 69 6d 6d 65 64 69 61  and 7 by immedia
1ab40 74 65 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a 20  tely returning. 
1ab50 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74     ** FALSE if t
1ab60 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69  he first compari
1ab70 73 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  son is not NULL 
1ab80 2a 2f 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75  */.    destNotNu
1ab90 6c 6c 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65  ll = destIfFalse
1aba0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1abb0 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
1abc0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
1abd0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
1abe0 6c 3b 0a 20 20 20 20 69 6e 74 20 72 33 20 3d 20  l;.    int r3 = 
1abf0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1ac00 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  g(pParse);.    p
1ac10 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
1ac20 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65  FieldSubexpr(pLe
1ac30 66 74 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c  ft, i);.    pCol
1ac40 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1ac50 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1ac60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1ac70 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1ac80 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54  olumn, pExpr->iT
1ac90 61 62 6c 65 2c 20 69 2c 20 72 33 29 3b 0a 20 20  able, i, r3);.  
1aca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1acb0 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c  Op4(v, OP_Ne, rL
1acc0 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c  hs+i, destNotNul
1acd0 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20  l, r3,.         
1ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
1acf0 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  id*)pColl, P4_CO
1ad00 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56 64 62 65  LLSEQ);.    Vdbe
1ad10 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1ad20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1ad30 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1ad40 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  3);.  }.  sqlite
1ad50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ad60 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
1ad70 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56  fNull);.  if( nV
1ad80 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73  ector>1 ){.    s
1ad90 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1ada0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f  eLabel(v, destNo
1adb0 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  tNull);.    sqli
1adc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1add0 20 4f 50 5f 4e 65 78 74 2c 20 70 45 78 70 72 2d   OP_Next, pExpr-
1ade0 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 54 6f 70  >iTable, addrTop
1adf0 2b 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  +1);.    VdbeCov
1ae00 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f  erage(v);..    /
1ae10 2a 20 53 74 65 70 20 37 3a 20 20 49 66 20 77 65  * Step 7:  If we
1ae20 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
1ae30 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  t, we know that 
1ae40 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 0a  the result must.
1ae50 20 20 20 20 2a 2a 20 62 65 20 66 61 6c 73 65 2e      ** be false.
1ae60 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
1ae70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ae80 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46  Goto, 0, destIfF
1ae90 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  alse);.  }..  /*
1aea0 20 4a 75 6d 70 73 20 68 65 72 65 20 69 6e 20 6f   Jumps here in o
1aeb0 72 64 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74  rder to return t
1aec0 72 75 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rue. */.  sqlite
1aed0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1aee0 20 61 64 64 72 54 72 75 74 68 4f 70 29 3b 0a 0a   addrTruthOp);..
1aef0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1af00 4e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66  N_finished:.  if
1af10 28 20 72 4c 68 73 21 3d 72 4c 68 73 4f 72 69 67  ( rLhs!=rLhsOrig
1af20 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73   ) sqlite3Releas
1af30 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1af40 20 72 4c 68 73 29 3b 0a 20 20 73 71 6c 69 74 65   rLhs);.  sqlite
1af50 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1af60 61 72 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 6d  arse);.  VdbeCom
1af70 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e  ment((v, "end IN
1af80 20 65 78 70 72 22 29 29 3b 0a 73 71 6c 69 74 65   expr"));.sqlite
1af90 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f  3ExprCodeIN_oom_
1afa0 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33  error:.  sqlite3
1afb0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1afc0 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c  b, aiMap);.  sql
1afd0 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1afe0 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a  e->db, zAff);.}.
1aff0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1b000 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
1b010 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1b020 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1b030 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  POINT./*.** Gene
1b040 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
1b050 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
1b060 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70  t the floating p
1b070 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65  oint.** value de
1b080 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e  scribed by z[0..
1b090 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
1b0a0 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er iMem..**.** T
1b0b0 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69  he z[] string wi
1b0c0 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  ll probably not 
1b0d0 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  be zero-terminat
1b0e0 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a  ed.  But the .**
1b0f0 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20   z[n] character 
1b100 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1b110 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   be something th
1b120 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  at does not look
1b130 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e  .** like the con
1b140 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  tinuation of the
1b150 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
1b160 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c  ic void codeReal
1b170 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
1b180 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67  char *z, int neg
1b190 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  ateFlag, int iMe
1b1a0 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  m){.  if( ALWAYS
1b1b0 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f  (z!=0) ){.    do
1b1c0 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20  uble value;.    
1b1d0 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26  sqlite3AtoF(z, &
1b1e0 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74  value, sqlite3St
1b1f0 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54  rlen30(z), SQLIT
1b200 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73  E_UTF8);.    ass
1b210 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e  ert( !sqlite3IsN
1b220 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20  aN(value) ); /* 
1b230 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76  The new AtoF nev
1b240 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a  er returns NaN *
1b250 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65  /.    if( negate
1b260 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d  Flag ) value = -
1b270 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  value;.    sqlit
1b280 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1b290 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
1b2a0 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76  iMem, 0, (u8*)&v
1b2b0 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a  alue, P4_REAL);.
1b2c0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
1b2d0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
1b2e0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
1b2f0 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
1b300 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
1b310 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
1b320 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
1b330 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45  er iMem..**.** E
1b340 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20  xpr.u.zToken is 
1b350 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20  always UTF8 and 
1b360 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
1b370 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b380 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73  codeInteger(Pars
1b390 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1b3a0 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46  *pExpr, int negF
1b3b0 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
1b3c0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1b3d0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
1b3e0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
1b3f0 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
1b400 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72     int i = pExpr
1b410 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
1b420 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a  assert( i>=0 );.
1b430 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
1b440 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71  ) i = -i;.    sq
1b450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b460 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
1b470 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  , iMem);.  }else
1b480 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20  {.    int c;.   
1b490 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20   i64 value;.    
1b4a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1b4b0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
1b4c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
1b4d0 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c  0 );.    c = sql
1b4e0 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
1b4f0 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  4(z, &value);.  
1b500 20 20 69 66 28 20 28 63 3d 3d 33 20 26 26 20 21    if( (c==3 && !
1b510 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28 63 3d 3d  negFlag) || (c==
1b520 32 29 20 7c 7c 20 28 6e 65 67 46 6c 61 67 20 26  2) || (negFlag &
1b530 26 20 76 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53  & value==SMALLES
1b540 54 5f 49 4e 54 36 34 29 29 7b 0a 23 69 66 64 65  T_INT64)){.#ifde
1b550 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1b560 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1b570 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1b580 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72  sg(pParse, "over
1b590 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25  sized integer: %
1b5a0 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20  s%s", negFlag ? 
1b5b0 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65  "-" : "", z);.#e
1b5c0 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  lse.#ifndef SQLI
1b5d0 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45  TE_OMIT_HEX_INTE
1b5e0 47 45 52 0a 20 20 20 20 20 20 69 66 28 20 73 71  GER.      if( sq
1b5f0 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
1b600 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20  ,"0x",2)==0 ){. 
1b610 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1b620 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1b630 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20  hex literal too 
1b640 62 69 67 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  big: %s%s", negF
1b650 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20  lag?"-":"",z);. 
1b660 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
1b670 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
1b680 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c    codeReal(v, z,
1b690 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b   negFlag, iMem);
1b6a0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1b6b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b6c0 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20   if( negFlag ){ 
1b6d0 76 61 6c 75 65 20 3d 20 63 3d 3d 33 20 3f 20 53  value = c==3 ? S
1b6e0 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20  MALLEST_INT64 : 
1b6f0 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20  -value; }.      
1b700 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b710 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36  4Dup8(v, OP_Int6
1b720 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  4, 0, iMem, 0, (
1b730 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49  u8*)&value, P4_I
1b740 4e 54 36 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NT64);.    }.  }
1b750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
1b760 63 6f 6c 75 6d 6e 2d 63 61 63 68 65 20 65 6e 74  column-cache ent
1b770 72 79 20 6e 75 6d 62 65 72 20 69 0a 2a 2f 0a 73  ry number i.*/.s
1b780 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 68 65  tatic void cache
1b790 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73 65  EntryClear(Parse
1b7a0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 29   *pParse, int i)
1b7b0 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
1b7c0 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d  aColCache[i].tem
1b7d0 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20  pReg ){.    if( 
1b7e0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1b7f0 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
1b800 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
1b810 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54        pParse->aT
1b820 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
1b830 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61  TempReg++] = pPa
1b840 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1b850 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ].iReg;.    }.  
1b860 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  }.  pParse->nCol
1b870 43 61 63 68 65 2d 2d 3b 0a 20 20 69 66 28 20 69  Cache--;.  if( i
1b880 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1b890 68 65 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  he ){.    pParse
1b8a0 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d  ->aColCache[i] =
1b8b0 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
1b8c0 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  he[pParse->nColC
1b8d0 61 63 68 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ache];.  }.}.../
1b8e0 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74  *.** Record in t
1b8f0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
1b900 74 68 61 74 20 61 20 70 61 72 74 69 63 75 6c 61  that a particula
1b910 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a  r column from a.
1b920 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74 61  ** particular ta
1b930 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ble is stored in
1b940 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65   a particular re
1b950 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  gister..*/.void 
1b960 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1b970 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61  Store(Parse *pPa
1b980 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69  rse, int iTab, i
1b990 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65  nt iCol, int iRe
1b9a0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
1b9b0 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74  nt minLru;.  int
1b9c0 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63   idxLru;.  struc
1b9d0 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
1b9e0 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20  .  /* Unless an 
1b9f0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
1ba00 65 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ed, register num
1ba10 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20  bers are always 
1ba20 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61  positive. */.  a
1ba30 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c  ssert( iReg>0 ||
1ba40 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
1ba50 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1ba60 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61  locFailed );.  a
1ba70 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20  ssert( iCol>=-1 
1ba80 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b  && iCol<32768 );
1ba90 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75    /* Finite colu
1baa0 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20  mn numbers */.. 
1bab0 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43   /* The SQLITE_C
1bac0 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20  olumnCache flag 
1bad0 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c  disables the col
1bae0 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73  umn cache.  This
1baf0 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f   is used.  ** fo
1bb00 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d  r testing only -
1bb10 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
1bb20 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65  SQLite always ge
1bb30 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  ts the same answ
1bb40 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64  er.  ** with and
1bb50 20 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c   without the col
1bb60 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a  umn cache..  */.
1bb70 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
1bb80 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73  onDisabled(pPars
1bb90 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f  e->db, SQLITE_Co
1bba0 6c 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74  lumnCache) ) ret
1bbb0 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74  urn;..  /* First
1bbc0 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69   replace any exi
1bbd0 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a  sting entry..  *
1bbe0 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
1bbf0 20 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c   the way the col
1bc00 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72  umn cache is cur
1bc10 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20  rently used, we 
1bc20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20  are guaranteed. 
1bc30 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a   ** that the obj
1bc40 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  ect will never a
1bc50 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63  lready be in cac
1bc60 68 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73  he.  Verify this
1bc70 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f   guarantee..  */
1bc80 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1bc90 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
1bca0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
1bcb0 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1bcc0 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  che; i++, p++){.
1bcd0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
1bce0 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70  Table!=iTab || p
1bcf0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20  ->iColumn!=iCol 
1bd00 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
1bd10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1bd20 55 47 5f 43 4f 4c 55 4d 4e 43 41 43 48 45 0a 20  UG_COLUMNCACHE. 
1bd30 20 2f 2a 20 41 64 64 20 61 20 53 65 74 54 61 62   /* Add a SetTab
1bd40 43 6f 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 72  Col opcode for r
1bd50 75 6e 2d 74 69 6d 65 20 76 65 72 69 66 69 63 61  un-time verifica
1bd60 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 63 6f  tion that the co
1bd70 6c 75 6d 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20  lumn.  ** cache 
1bd80 69 73 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65  is working corre
1bd90 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ctly..  */.  sql
1bda0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1bdb0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1bdc0 5f 53 65 74 54 61 62 43 6f 6c 2c 20 69 54 61 62  _SetTabCol, iTab
1bdd0 2c 20 69 43 6f 6c 2c 20 69 52 65 67 29 3b 0a 23  , iCol, iReg);.#
1bde0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
1bdf0 68 65 20 63 61 63 68 65 20 69 73 20 61 6c 72 65  he cache is alre
1be00 61 64 79 20 66 75 6c 6c 2c 20 64 65 6c 65 74 65  ady full, delete
1be10 20 74 68 65 20 6c 65 61 73 74 20 72 65 63 65 6e   the least recen
1be20 74 6c 79 20 75 73 65 64 20 65 6e 74 72 79 20 2a  tly used entry *
1be30 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
1be40 6e 43 6f 6c 43 61 63 68 65 3e 3d 53 51 4c 49 54  nColCache>=SQLIT
1be50 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 20 29 7b 0a  E_N_COLCACHE ){.
1be60 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37      minLru = 0x7
1be70 66 66 66 66 66 66 66 3b 0a 20 20 20 20 69 64 78  fffffff;.    idx
1be80 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f  Lru = -1;.    fo
1be90 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1bea0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
1beb0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
1bec0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1bed0 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e    if( p->lru<min
1bee0 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Lru ){.        i
1bef0 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
1bf00 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c     minLru = p->l
1bf10 72 75 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ru;.      }.    
1bf20 7d 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  }.    p = &pPars
1bf30 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78  e->aColCache[idx
1bf40 4c 72 75 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Lru];.  }else{. 
1bf50 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
1bf60 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65  aColCache[pParse
1bf70 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a  ->nColCache++];.
1bf80 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
1bf90 65 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74  e new entry to t
1bfa0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61  he end of the ca
1bfb0 63 68 65 20 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76  che */.  p->iLev
1bfc0 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
1bfd0 63 68 65 4c 65 76 65 6c 3b 0a 20 20 70 2d 3e 69  cheLevel;.  p->i
1bfe0 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
1bff0 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
1c000 6c 3b 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20 69  l;.  p->iReg = i
1c010 52 65 67 3b 0a 20 20 70 2d 3e 74 65 6d 70 52 65  Reg;.  p->tempRe
1c020 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 6c 72 75 20  g = 0;.  p->lru 
1c030 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1c040 43 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cnt++;.}../*.** 
1c050 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65  Indicate that re
1c060 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20  gisters between 
1c070 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d  iReg..iReg+nReg-
1c080 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72  1 are being over
1c090 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67  written..** Purg
1c0a0 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72  e the range of r
1c0b0 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68  egisters from th
1c0c0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
1c0d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1c0e0 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50  xprCacheRemove(P
1c0f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1c100 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
1c110 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  ){.  int i = 0;.
1c120 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73    while( i<pPars
1c130 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a  e->nColCache ){.
1c140 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
1c150 61 63 68 65 20 2a 70 20 3d 20 26 70 50 61 72 73  ache *p = &pPars
1c160 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b  e->aColCache[i];
1c170 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
1c180 20 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69   >= iReg && p->i
1c190 52 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20  Reg < iReg+nReg 
1c1a0 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
1c1b0 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
1c1c0 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   i);.    }else{.
1c1d0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
1c1e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
1c1f0 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65  member the curre
1c200 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  nt column cache 
1c210 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65  context.  Any ne
1c220 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a  w entries added.
1c230 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
1c240 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74  column cache aft
1c250 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65  er this call are
1c260 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68   removed when th
1c270 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
1c280 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a  ng pop occurs..*
1c290 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1c2a0 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73  prCachePush(Pars
1c2b0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
1c2c0 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1c2d0 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  l++;.#ifdef SQLI
1c2e0 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1c2f0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1c300 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
1c310 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
1c320 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20  printf("PUSH to 
1c330 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69  %d\n", pParse->i
1c340 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d  CacheLevel);.  }
1c350 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
1c360 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65   Remove from the
1c370 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e   column cache an
1c380 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77  y entries that w
1c390 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20  ere added since 
1c3a0 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69  the.** the previ
1c3b0 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43  ous sqlite3ExprC
1c3c0 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69  achePush operati
1c3d0 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
1c3e0 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20  rds, restore.** 
1c3f0 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65  the cache to the
1c400 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
1c410 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20   prior the most 
1c420 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a  recent Push..*/.
1c430 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1c440 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a  CachePop(Parse *
1c450 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
1c460 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1c470 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c480 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72  vel>=1 );.  pPar
1c490 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d  se->iCacheLevel-
1c4a0 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  -;.#ifdef SQLITE
1c4b0 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1c4c0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
1c4d0 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
1c4e0 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
1c4f0 69 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64  intf("POP  to %d
1c500 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61  \n", pParse->iCa
1c510 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23  cheLevel);.  }.#
1c520 65 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 20 69  endif.  while( i
1c530 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1c540 68 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  he ){.    if( pP
1c550 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1c560 69 5d 2e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  i].iLevel>pParse
1c570 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
1c580 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
1c590 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69  yClear(pParse, i
1c5a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c5b0 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20      i++;.    }. 
1c5c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
1c5d0 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
1c5e0 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
1c5f0 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
1c600 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
1c610 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
1c620 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
1c630 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
1c640 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
1c650 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
1c660 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
1c670 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
1c680 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
1c690 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
1c6a0 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
1c6b0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1c6c0 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
1c6d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1c6e0 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
1c6f0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1c700 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
1c710 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1c720 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
1c730 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1c740 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
1c750 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
1c760 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
1c770 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
1c780 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74   }.}../* Generat
1c790 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1c7a0 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73   load into regis
1c7b0 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c  ter regOut a val
1c7c0 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70  ue that is.** ap
1c7d0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
1c7e0 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c  e iIdxCol-th col
1c7f0 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
1c800 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
1c810 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e  e3ExprCodeLoadIn
1c820 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  dexColumn(.  Par
1c830 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20  se *pParse,  /* 
1c840 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1c850 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
1c860 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20  pIdx,    /* The 
1c870 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75  index whose colu
1c880 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64  mn is to be load
1c890 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
1c8a0 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f  Cur,    /* Curso
1c8b0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  r pointing to a 
1c8c0 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69  table row */.  i
1c8d0 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f  nt iIdxCol,    /
1c8e0 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  * The column of 
1c8f0 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  the index to be 
1c900 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
1c910 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53  regOut      /* S
1c920 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63  tore the index c
1c930 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74  olumn value in t
1c940 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1c950 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c  ){.  i16 iTabCol
1c960 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
1c970 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66  n[iIdxCol];.  if
1c980 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58  ( iTabCol==XN_EX
1c990 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  PR ){.    assert
1c9a0 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
1c9b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1c9c0 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1c9d0 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b  nExpr>iIdxCol );
1c9e0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65  .    pParse->iSe
1c9f0 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 20  lfTab = iTabCur 
1ca00 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  + 1;.    sqlite3
1ca10 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61  ExprCodeCopy(pPa
1ca20 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45  rse, pIdx->aColE
1ca30 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e  xpr->a[iIdxCol].
1ca40 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a  pExpr, regOut);.
1ca50 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
1ca60 66 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  fTab = 0;.  }els
1ca70 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1ca80 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
1ca90 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70  fTable(pParse->p
1caa0 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62  Vdbe, pIdx->pTab
1cab0 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20  le, iTabCur,.   
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74   iTabCol, regOut
1caf0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1cb00 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1cb10 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   extract the val
1cb20 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74  ue of the iCol-t
1cb30 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  h column of a ta
1cb40 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
1cb50 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1cb60 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20  olumnOfTable(.  
1cb70 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
1cb80 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65  /* The VDBE unde
1cb90 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1cba0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1cbb0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1cbc0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1cbd0 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
1cbe0 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68  TabCur,    /* Th
1cbf0 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20  e table cursor. 
1cc00 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f   Or the PK curso
1cc10 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  r for WITHOUT RO
1cc20 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  WID */.  int iCo
1cc30 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  l,       /* Inde
1cc40 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
1cc50 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20  to extract */.  
1cc60 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
1cc70 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
1cc80 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72  alue into this r
1cc90 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1cca0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
1ccb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ccc0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1ccd0 6e 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c  n, iTabCur, iCol
1cce0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 72  , regOut);.    r
1ccf0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
1cd00 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d   iCol<0 || iCol=
1cd10 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
1cd20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cd30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
1cd40 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f  d, iTabCur, regO
1cd50 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
1cd60 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
1cd70 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
1cd80 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
1cd90 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  umn;.    int x =
1cda0 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21   iCol;.    if( !
1cdb0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
1cdc0 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
1cdd0 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20  b) ){.      x = 
1cde0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
1cdf0 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d  ndex(sqlite3Prim
1ce00 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
1ce10 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  ), iCol);.    }.
1ce20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ce30 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61  ddOp3(v, op, iTa
1ce40 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29  bCur, x, regOut)
1ce50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
1ce60 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
1ce70 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28  e3ColumnDefault(
1ce80 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72  v, pTab, iCol, r
1ce90 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  egOut);.  }.}../
1cea0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1ceb0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  de that will ext
1cec0 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e  ract the iColumn
1ced0 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a  -th column from.
1cee0 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  ** table pTab an
1cef0 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  d store the colu
1cf00 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65  mn value in a re
1cf10 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41  gister. .**.** A
1cf20 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
1cf30 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
1cf40 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
1cf50 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68  gister iReg.  Th
1cf60 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72  is.** is not gar
1cf70 61 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74 43  anteeed for GetC
1cf80 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65  olumn() - the re
1cf90 73 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72  sult can be stor
1cfa0 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67  ed in.** any reg
1cfb0 69 73 74 65 72 2e 20 20 42 75 74 20 74 68 65 20  ister.  But the 
1cfc0 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e  result is guaran
1cfd0 74 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20  teed to land in 
1cfe0 72 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a  register iReg.**
1cff0 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f   for GetColumnTo
1d000 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Reg()..**.** The
1d010 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
1d020 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61  en cursor to pTa
1d030 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e  b in iTable when
1d040 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1d050 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20   is called.  If 
1d060 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63  iColumn<0 then c
1d070 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
1d080 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
1d090 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  he rowid..*/.int
1d0a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d0b0 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  GetColumn(.  Par
1d0c0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
1d0d0 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1d0e0 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1d0f0 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1d100 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
1d110 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1d120 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
1d130 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
1d140 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
1d150 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1d160 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
1d170 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1d180 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1d190 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
1d1a0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1d1b0 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a   iReg,        /*
1d1c0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
1d1d0 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  ere */.  u8 p5  
1d1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20            /* P5 
1d1f0 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c  value for OP_Col
1d200 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29  umn + FLAGS */.)
1d210 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1d220 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1d230 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1d240 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
1d250 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
1d260 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
1d270 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1d280 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
1d290 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d    if( p->iTable=
1d2a0 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43  =iTable && p->iC
1d2b0 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
1d2c0 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d  {.      p->lru =
1d2d0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
1d2e0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
1d2f0 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52  te3ExprCachePinR
1d300 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
1d310 70 2d 3e 69 52 65 67 29 3b 0a 23 69 66 64 65 66  p->iReg);.#ifdef
1d320 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 43 4f   SQLITE_DEBUG_CO
1d330 4c 55 4d 4e 43 41 43 48 45 0a 20 20 20 20 20 20  LUMNCACHE.      
1d340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d350 33 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 54 61  3(v, OP_VerifyTa
1d360 62 43 6f 6c 2c 20 69 54 61 62 6c 65 2c 20 69 43  bCol, iTable, iC
1d370 6f 6c 75 6d 6e 2c 20 70 2d 3e 69 52 65 67 29 3b  olumn, p->iReg);
1d380 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
1d390 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
1d3a0 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
1d3b0 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
1d3c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1d3d0 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
1d3e0 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
1d3f0 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
1d400 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73   if( p5 ){.    s
1d410 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1d420 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c  P5(v, p5);.  }el
1d430 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74  se{   .    sqlit
1d440 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1d450 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c  (pParse, iTable,
1d460 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
1d470 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
1d480 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  eg;.}.void sqlit
1d490 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1d4a0 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61 72 73  umnToReg(.  Pars
1d4b0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
1d4c0 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
1d4d0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
1d4e0 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
1d4f0 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
1d500 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1d510 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
1d520 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
1d530 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
1d540 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1d550 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
1d560 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1d570 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1d580 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1d590 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1d5a0 69 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20  iReg         /* 
1d5b0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
1d5c0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
1d5d0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1d5e0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1d5f0 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75  rse, pTab, iColu
1d600 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67  mn, iTable, iReg
1d610 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31 21 3d  , 0);.  if( r1!=
1d620 69 52 65 67 20 29 20 73 71 6c 69 74 65 33 56 64  iReg ) sqlite3Vd
1d630 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
1d640 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
1d650 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a  , r1, iReg);.}..
1d660 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c  ./*.** Clear all
1d670 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e   column cache en
1d680 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tries..*/.void s
1d690 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
1d6a0 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72  lear(Parse *pPar
1d6b0 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  se){.  int i;..#
1d6c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1d6d0 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
1d6e0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1d6f0 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1d700 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1d710 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d  ("CLEAR\n");.  }
1d720 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
1d730 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  0; i<pParse->nCo
1d740 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20  lCache; i++){.  
1d750 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
1d760 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52  olCache[i].tempR
1d770 65 67 0a 20 20 20 20 20 26 26 20 70 50 61 72 73  eg.     && pPars
1d780 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
1d790 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
1d7a0 65 6d 70 52 65 67 29 0a 20 20 20 20 29 7b 0a 20  empReg).    ){. 
1d7b0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54        pParse->aT
1d7c0 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
1d7d0 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61  TempReg++] = pPa
1d7e0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1d7f0 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ].iReg;.    }.  
1d800 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  }.  pParse->nCol
1d810 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Cache = 0;.}../*
1d820 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66  .** Record the f
1d830 61 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69  act that an affi
1d840 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20  nity change has 
1d850 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75  occurred on iCou
1d860 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20  nt.** registers 
1d870 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53  starting with iS
1d880 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tart..*/.void sq
1d890 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1d8a0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72  finityChange(Par
1d8b0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1d8c0 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75  iStart, int iCou
1d8d0 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  nt){.  sqlite3Ex
1d8e0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1d8f0 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43  arse, iStart, iC
1d900 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ount);.}../*.** 
1d910 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1d920 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72   move content fr
1d930 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72  om registers iFr
1d940 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d  om...iFrom+nReg-
1d950 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f  1.** over to iTo
1d960 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65  ..iTo+nReg-1. Ke
1d970 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ep the column ca
1d980 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  che up-to-date..
1d990 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1d9a0 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73  xprCodeMove(Pars
1d9b0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1d9c0 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
1d9d0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65  nt nReg){.  asse
1d9e0 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e  rt( iFrom>=iTo+n
1d9f0 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65  Reg || iFrom+nRe
1da00 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69  g<=iTo );.  sqli
1da10 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50  te3VdbeAddOp3(pP
1da20 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1da30 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f  Move, iFrom, iTo
1da40 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74  , nReg);.  sqlit
1da50 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1da60 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c  e(pParse, iFrom,
1da70 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64   nReg);.}..#if d
1da80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1da90 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
1daa0 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
1dab0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
1dac0 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72  rn true if any r
1dad0 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72  egister in the r
1dae0 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20  ange iFrom..iTo 
1daf0 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69  (inclusive).** i
1db00 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
1db10 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  f the column cac
1db20 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  he..**.** This r
1db30 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 77  outine is used w
1db40 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61  ithin assert() a
1db50 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61  nd testcase() ma
1db60 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64  cros only.** and
1db70 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
1db80 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69   in a normal bui
1db90 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ld..*/.static in
1dba0 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  t usedAsColumnCa
1dbb0 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
1dbc0 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
1dbd0 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  t iTo){.  int i;
1dbe0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1dbf0 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
1dc00 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1dc10 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
1dc20 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1dc30 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
1dc40 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
1dc50 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26   if( r>=iFrom &&
1dc60 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e   r<=iTo ) return
1dc70 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54   1;    /*NO_TEST
1dc80 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1dc90 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
1dca0 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53  QLITE_DEBUG || S
1dcb0 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
1dcc0 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43  EST */.../*.** C
1dcd0 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61 72 20  onvert a scalar 
1dce0 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1dcf0 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  to a TK_REGISTER
1dd00 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20   referencing.** 
1dd10 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20  register iReg.  
1dd20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1dd30 65 6e 73 75 72 65 20 74 68 61 74 20 69 52 65 67  ensure that iReg
1dd40 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
1dd50 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  s.** the correct
1dd60 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 65   value for the e
1dd70 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74  xpression..*/.st
1dd80 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f  atic void exprTo
1dd90 52 65 67 69 73 74 65 72 28 45 78 70 72 20 2a 70  Register(Expr *p
1dda0 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70  , int iReg){.  p
1ddb0 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20  ->op2 = p->op;. 
1ddc0 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49   p->op = TK_REGI
1ddd0 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  STER;.  p->iTabl
1dde0 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72  e = iReg;.  Expr
1ddf0 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c  ClearProperty(p,
1de00 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a   EP_Skip);.}../*
1de10 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 6e 20  .** Evaluate an 
1de20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69 74 68  expression (eith
1de30 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61  er a vector or a
1de40 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
1de50 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a  on) and store.**
1de60 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 63   the result in c
1de70 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f  ontinguous tempo
1de80 72 61 72 79 20 72 65 67 69 73 74 65 72 73 2e 20  rary registers. 
1de90 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1dea0 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  x of.** the firs
1deb0 74 20 72 65 67 69 73 74 65 72 20 75 73 65 64 20  t register used 
1dec0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
1ded0 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ult..**.** If th
1dee0 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c  e returned resul
1def0 74 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  t register is a 
1df00 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c 61 72  temporary scalar
1df10 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74  , then also writ
1df20 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69 73 74  e.** that regist
1df30 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  er number into *
1df40 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49 66 20  piFreeable.  If 
1df50 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73  the returned res
1df60 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  ult register.** 
1df70 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
1df80 72 79 20 6f 72 20 69 66 20 74 68 65 20 65 78 70  ry or if the exp
1df90 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63  ression is a vec
1dfa0 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65 65 61  tor set *piFreea
1dfb0 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a  ble.** to 0..*/.
1dfc0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
1dfd0 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73 65 20  odeVector(Parse 
1dfe0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1dff0 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61 62 6c  , int *piFreeabl
1e000 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73 75 6c  e){.  int iResul
1e010 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  t;.  int nResult
1e020 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
1e030 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20 69  ctorSize(p);.  i
1e040 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b  f( nResult==1 ){
1e050 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73  .    iResult = s
1e060 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e070 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 69  mp(pParse, p, pi
1e080 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c  Freeable);.  }el
1e090 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65 65 61  se{.    *piFreea
1e0a0 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ble = 0;.    if(
1e0b0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43   p->op==TK_SELEC
1e0c0 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  T ){.#if SQLITE_
1e0d0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1e0e0 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 30 3b      iResult = 0;
1e0f0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 52 65  .#else.      iRe
1e100 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  sult = sqlite3Co
1e110 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
1e120 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 23 65  se, p, 0, 0);.#e
1e130 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
1e140 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1e150 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70 50 61     iResult = pPa
1e160 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
1e170 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1e180 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20  += nResult;.    
1e190 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
1e1a0 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sult; i++){.    
1e1b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e1c0 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50  odeFactorable(pP
1e1d0 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  arse, p->x.pList
1e1e0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b  ->a[i].pExpr, i+
1e1f0 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  iResult);.      
1e200 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
1e210 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a  turn iResult;.}.
1e220 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1e230 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
1e240 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
1e250 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
1e260 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  n.** expression.
1e270 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f    Attempt to sto
1e280 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1e290 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67  n register "targ
1e2a0 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  et"..** Return t
1e2b0 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72  he register wher
1e2c0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
1e2d0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ored..**.** With
1e2e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
1e2f0 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61  here is no guara
1e300 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74  ntee that result
1e310 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f  s will.** be sto
1e320 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20  red in target.  
1e330 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74  The result might
1e340 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f   be stored in so
1e350 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69  me other.** regi
1e360 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f  ster if it is co
1e370 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73  nvenient to do s
1e380 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  o.  The calling 
1e390 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
1e3a0 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
1e3b0 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20  n code and move 
1e3c0 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74  the results to t
1e3d0 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65  he desired.** re
1e3e0 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  gister..*/.int s
1e3f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1e400 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72  rget(Parse *pPar
1e410 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1e420 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
1e430 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1e440 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65  ->pVdbe;  /* The
1e450 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72   VM under constr
1e460 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
1e470 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1e480 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
1e490 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ode being coded 
1e4a0 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d  */.  int inReg =
1e4b0 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f   target;       /
1e4c0 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64  * Results stored
1e4d0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52   in register inR
1e4e0 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  eg */.  int regF
1e4f0 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ree1 = 0;       
1e500 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
1e510 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
1e520 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
1e530 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
1e540 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
1e550 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
1e560 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
1e570 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
1e580 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20 20 20  t r1, r2;       
1e590 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f          /* Vario
1e5a0 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  us register numb
1e5b0 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 74 65  ers */.  Expr te
1e5c0 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  mpX;            
1e5d0 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
1e5e0 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1e5f0 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b  */.  int p5 = 0;
1e600 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
1e610 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
1e620 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
1e630 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
1e640 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1e650 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1e660 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
1e670 20 30 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f 63 6f   0;.  }..expr_co
1e680 64 65 5f 64 6f 6f 76 65 72 3a 0a 20 20 69 66 28  de_doover:.  if(
1e690 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
1e6a0 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
1e6b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
1e6c0 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
1e6d0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1e6e0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1e6f0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1e700 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1e710 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
1e720 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
1e730 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1e740 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
1e750 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
1e760 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
1e770 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
1e780 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
1e790 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
1e7a0 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  m>0 );.        r
1e7b0 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d  eturn pCol->iMem
1e7c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1e7d0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
1e7e0 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
1e7f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e800 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1e810 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
1e820 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20  ortingIdxPTab,. 
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1e850 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
1e860 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e870 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e890 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  /* Otherwise, fa
1e8a0 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
1e8b0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20   TK_COLUMN case 
1e8c0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
1e8d0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
1e8e0 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20       int iTab = 
1e8f0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
1e900 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20       if( iTab<0 
1e910 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1e920 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c  Parse->iSelfTab<
1e930 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1e940 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1e950 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1e960 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1e970 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1e980 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1e990 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  rn pExpr->iColum
1e9a0 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  n - pParse->iSel
1e9b0 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 65  fTab;.        }e
1e9c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1e9d0 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1e9e0 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1e9f0 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1ea00 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1ea10 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1ea20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1ea30 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1ea40 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1ea50 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1ea60 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1ea70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1ea80 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 1;.        }. 
1ea90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1eaa0 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1eab0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1eac0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  rse, pExpr->pTab
1ead0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaf0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1eb00 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20   iTab, target,. 
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1eb30 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d  xpr->op2);.    }
1eb40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
1eb50 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
1eb60 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1eb70 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
1eb80 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1eb90 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1eba0 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 45      case TK_TRUE
1ebb0 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20 20 73  FALSE: {.      s
1ebc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ebd0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1ebe0 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
1ebf0 56 61 6c 75 65 28 70 45 78 70 72 29 2c 20 74 61  Value(pExpr), ta
1ec00 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1ec10 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1ec20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1ec30 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1ec40 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
1ec50 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1ec60 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ec70 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ec80 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1ec90 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1eca0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1ecb0 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
1ecc0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1ecd0 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  et;.    }.#endif
1ece0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
1ecf0 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ING: {.      ass
1ed00 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1ed10 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1ed20 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1ed30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1ed40 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67  adString(v, targ
1ed50 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  et, pExpr->u.zTo
1ed60 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ken);.      retu
1ed70 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1ed80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1ed90 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
1eda0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1edb0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
1edc0 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1edd0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1ede0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1edf0 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
1ee00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
1ee10 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
1ee20 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
1ee30 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61  ar *z;.      cha
1ee40 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20  r *zBlob;.      
1ee50 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ee60 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ee70 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1ee80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1ee90 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
1eea0 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e  =='x' || pExpr->
1eeb0 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27  u.zToken[0]=='X'
1eec0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1eed0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1eee0 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  n[1]=='\'' );.  
1eef0 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e      z = &pExpr->
1ef00 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20  u.zToken[2];.   
1ef10 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
1ef20 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20  rlen30(z) - 1;. 
1ef30 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e       assert( z[n
1ef40 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
1ef50 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   zBlob = sqlite3
1ef60 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65  HexToBlob(sqlite
1ef70 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e  3VdbeDb(v), z, n
1ef80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ef90 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1efa0 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67  _Blob, n/2, targ
1efb0 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34  et, 0, zBlob, P4
1efc0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
1efd0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1efe0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1eff0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
1f000 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
1f010 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1f020 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1f030 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1f040 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f050 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
1f060 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1f070 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
1f080 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1f090 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f0a0 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
1f0b0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
1f0c0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1f0d0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1f0e0 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
1f0f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1f100 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75  = sqlite3VListNu
1f110 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e  mToName(pParse->
1f120 70 56 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 69  pVList, pExpr->i
1f130 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
1f140 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f150 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27  u.zToken[0]=='?'
1f160 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72   || strcmp(pExpr
1f170 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d  ->u.zToken, z)==
1f180 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
1f190 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d  rse->pVList[0] =
1f1a0 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65 20   0; /* Indicate 
1f1b0 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e  VList may no lon
1f1c0 67 65 72 20 62 65 20 65 6e 6c 61 72 67 65 64 20  ger be enlarged 
1f1d0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
1f1e0 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
1f1f0 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53  , (char*)z, P4_S
1f200 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
1f210 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1f220 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
1f230 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
1f240 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1f250 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
1f260 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1f270 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
1f280 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
1f290 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
1f2a0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
1f2b0 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
1f2c0 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
1f2d0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1f2e0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1f2f0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
1f300 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
1f310 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
1f320 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
1f330 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f340 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1f350 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
1f360 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1f370 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
1f380 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1f390 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f3a0 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20  _Cast, target,. 
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66         sqlite3Af
1f3d0 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
1f3e0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b  ->u.zToken, 0));
1f3f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f400 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
1f410 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  he(pParse, inReg
1f420 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20  , inReg) );.    
1f430 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f440 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1f450 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1f460 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
1f470 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65   inReg;.    }.#e
1f480 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1f490 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
1f4a0 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
1f4b0 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
1f4c0 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
1f4d0 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
1f4e0 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20  TK_NE;.      p5 
1f4f0 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
1f500 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74  .      /* fall-t
1f510 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61  hrough */.    ca
1f520 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1f530 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1f540 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1f550 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1f560 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1f570 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1f580 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
1f590 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1f5a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1f5b0 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66  xprIsVector(pLef
1f5c0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  t) ){.        co
1f5d0 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28  deVectorCompare(
1f5e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1f5f0 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a  arget, op, p5);.
1f600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f610 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1f620 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f630 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65  arse, pLeft, &re
1f640 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
1f650 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1f660 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f670 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f680 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1f690 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1f6a0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1f6b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1f6c0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  p,.            r
1f6d0 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
1f6e0 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70  LITE_STOREP2 | p
1f6f0 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  5);.        asse
1f700 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
1f710 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f720 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
1f730 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1f740 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
1f750 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
1f760 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f770 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
1f780 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1f790 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
1f7a0 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
1f7b0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f7c0 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
1f7d0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1f7e0 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
1f7f0 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
1f800 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f810 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
1f820 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1f830 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
1f840 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
1f850 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f860 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
1f870 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
1f880 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  q);.        asse
1f890 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
1f8a0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f8b0 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
1f8c0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
1f8d0 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
1f8e0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f8f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
1f900 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1f910 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
1f920 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f930 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1f940 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
1f950 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
1f960 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
1f970 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
1f980 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
1f990 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
1f9a0 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
1f9b0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
1f9c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
1f9d0 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
1f9e0 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
1f9f0 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
1fa00 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
1fa10 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1fa20 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
1fa30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65  );            te
1fa40 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41  stcase( op==TK_A
1fa50 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
1fa60 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
1fa70 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
1fa80 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fa90 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  K_OR );.      as
1faa0 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
1fab0 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20  P_Add );        
1fac0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1fad0 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
1fae0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
1faf0 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
1fb00 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28  );     testcase(
1fb10 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
1fb20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1fb30 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
1fb40 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74  der );      test
1fb50 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
1fb60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1fb70 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
1fb80 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74  BitAnd );      t
1fb90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fba0 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  BITAND );.      
1fbb0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
1fbc0 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20  ==OP_BitOr );   
1fbd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1fbe0 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
1fbf0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1fc00 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
1fc10 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61   );       testca
1fc20 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48  se( op==TK_SLASH
1fc30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1fc40 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
1fc50 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74  ShiftLeft );   t
1fc60 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fc70 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  LSHIFT );.      
1fc80 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
1fc90 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
1fca0 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f   );  testcase( o
1fcb0 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a  p==TK_RSHIFT );.
1fcc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1fcd0 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
1fce0 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  at );      testc
1fcf0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43  ase( op==TK_CONC
1fd00 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  AT );.      r1 =
1fd10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fd20 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1fd30 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1fd40 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1fd50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fd60 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1fd70 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1fd80 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73  gFree2);.      s
1fd90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1fda0 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20  (v, op, r2, r1, 
1fdb0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74  target);.      t
1fdc0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fdd0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1fde0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1fdf0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1fe00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fe10 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
1fe20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
1fe30 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
1fe40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fe50 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
1fe60 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
1fe70 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
1fe80 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
1fe90 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31  pParse, pLeft, 1
1fea0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1feb0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1fec0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1fed0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1fee0 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65  OINT.      }else
1fef0 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
1ff00 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
1ff10 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1ff20 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1ff30 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1ff40 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
1ff50 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75  Real(v, pLeft->u
1ff60 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67  .zToken, 1, targ
1ff70 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1ff80 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64  urn target;.#end
1ff90 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  if.      }else{.
1ffa0 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70          tempX.op
1ffb0 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20   = TK_INTEGER;. 
1ffc0 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61         tempX.fla
1ffd0 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs = EP_IntValue
1ffe0 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20  |EP_TokenOnly;. 
1fff0 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69         tempX.u.i
20000 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20  Value = 0;.     
20010 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
20020 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
20030 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67  se, &tempX, &reg
20040 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
20050 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
20060 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
20070 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
20080 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
20090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
200a0 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
200b0 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72  act, r2, r1, tar
200c0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  get);.        te
200d0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
200e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
200f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20100 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
20110 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
20120 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
20130 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
20140 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20  ==OP_BitNot );  
20150 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
20160 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20  K_BITNOT );.    
20170 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
20180 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20  ==OP_Not );     
20190 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
201a0 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20  ==TK_NOT );.    
201b0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
201c0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
201d0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
201e0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
201f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
20200 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
20210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20220 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69  Op2(v, op, r1, i
20230 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
20240 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20250 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20  se TK_TRUTH: {. 
20260 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b       int isTrue;
20270 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f      /* IS TRUE o
20280 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f  r IS NOT TRUE */
20290 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 72 6d  .      int bNorm
202a0 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54 52 55 45  al;   /* IS TRUE
202b0 20 6f 72 20 49 53 20 46 41 4c 53 45 20 2a 2f 0a   or IS FALSE */.
202c0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
202d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
202e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
202f0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
20300 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20310 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
20320 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73        isTrue = s
20330 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56  qlite3ExprTruthV
20340 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67  alue(pExpr->pRig
20350 68 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72 6d  ht);.      bNorm
20360 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d  al = pExpr->op2=
20370 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74 65  =TK_IS;.      te
20380 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26  stcase( isTrue &
20390 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20  & bNormal);.    
203a0 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54    testcase( !isT
203b0 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b  rue && bNormal);
203c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
203d0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
203e0 50 5f 49 73 54 72 75 65 2c 20 72 31 2c 20 69 6e  P_IsTrue, r1, in
203f0 52 65 67 2c 20 21 69 73 54 72 75 65 2c 20 69 73  Reg, !isTrue, is
20400 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b  True ^ bNormal);
20410 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20420 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
20430 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
20440 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
20450 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
20460 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
20470 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
20480 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
20490 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
204a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
204b0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
204c0 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
204d0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
204e0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  LL );.      sqli
204f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20500 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
20510 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
20520 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
20530 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
20540 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
20550 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
20560 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
20570 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  e1==0 );.      a
20580 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
20590 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72  eAddOp1(v, op, r
205a0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
205b0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
205c0 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
205d0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
205e0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
205f0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
20600 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20610 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74  OP_Integer, 0, t
20620 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
20630 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
20640 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
20650 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
20660 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
20670 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
20680 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
20690 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
206a0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
206b0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
206c0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
206d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
206e0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
206f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20700 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20710 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
20720 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45  egate: %s()", pE
20730 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
20740 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20750 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66       return pInf
20760 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
20770 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
20780 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
20790 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
207a0 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
207b0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
207c0 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
207d0 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
207e0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
207f0 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
20800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20810 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
20820 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
20830 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
20840 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
20850 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
20860 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
20870 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
20880 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  *zId;       /* T
20890 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
208a0 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f   */.      u32 co
208b0 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  nstMask = 0;    
208c0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63   /* Mask of func
208d0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
208e0 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  hat are constant
208f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
20900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20910 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20920 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
20930 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
20940 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  db;  /* The data
20950 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
20960 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
20970 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20  = ENC(db);      
20980 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f  /* The text enco
20990 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69  ding used by thi
209a0 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
209b0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
209c0 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20  ll = 0;    /* A 
209d0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
209e0 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ce */..#ifndef S
209f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
20a00 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20  WFUNC.      if( 
20a10 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
20a20 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
20a30 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
20a40 20 26 26 20 70 45 78 70 72 2d 3e 70 57 69 6e 20   && pExpr->pWin 
20a50 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
20a60 6e 20 70 45 78 70 72 2d 3e 70 57 69 6e 2d 3e 72  n pExpr->pWin->r
20a70 65 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20  egResult;.      
20a80 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
20a90 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  if( ConstFactorO
20aa0 6b 28 70 50 61 72 73 65 29 20 26 26 20 73 71 6c  k(pParse) && sql
20ab0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
20ac0 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29  ntNotJoin(pExpr)
20ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
20ae0 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  QL functions can
20af0 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20 53   be expensive. S
20b00 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f  o try to move co
20b10 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73  nstant functions
20b20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 20  .        ** out 
20b30 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
20b40 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  p, even if that 
20b50 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20 4f  means an extra O
20b60 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20  P_Copy. */.     
20b70 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
20b80 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
20b90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d  pParse, pExpr, -
20ba0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
20bb0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
20bc0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
20bd0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
20be0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
20bf0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20c00 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
20c10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61  ) ){.        pFa
20c20 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rg = 0;.      }e
20c30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61  lse{.        pFa
20c40 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  rg = pExpr->x.pL
20c50 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
20c60 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67     nFarg = pFarg
20c70 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20   ? pFarg->nExpr 
20c80 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  : 0;.      asser
20c90 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
20ca0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
20cb0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
20cc0 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e   zId = pExpr->u.
20cd0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44  zToken;.      pD
20ce0 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
20cf0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64  Function(db, zId
20d00 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
20d10 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
20d20 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53  ENABLE_UNKNOWN_S
20d30 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20  QL_FUNCTION.    
20d40 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26    if( pDef==0 &&
20d50 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
20d60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
20d70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
20d80 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e  nction(db, "unkn
20d90 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63  own", nFarg, enc
20da0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
20db0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
20dc0 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e  Def==0 || pDef->
20dd0 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a  xFinalize!=0 ){.
20de0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20df0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
20e00 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f  "unknown functio
20e10 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a  n: %s()", zId);.
20e20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20e30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
20e40 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63   Attempt a direc
20e50 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
20e60 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   of the built-in
20e70 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a   COALESCE() and.
20e80 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28        ** IFNULL(
20e90 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  ) functions.  Th
20ea0 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65  is avoids unnece
20eb0 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e  ssary evaluation
20ec0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67   of.      ** arg
20ed0 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20  uments past the 
20ee0 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  first non-NULL a
20ef0 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
20f00 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
20f10 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
20f20 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53  LITE_FUNC_COALES
20f30 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  CE ){.        in
20f40 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20  t endCoalesce = 
20f50 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
20f60 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
20f70 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
20f80 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
20f90 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
20fa0 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
20fb0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
20fc0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
20fd0 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
20fe0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20ff0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21000 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67  OP_NotNull, targ
21010 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  et, endCoalesce)
21020 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
21030 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
21040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
21050 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
21060 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29  arse, target, 1)
21070 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
21080 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
21090 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
210a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
210b0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
210c0 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74  g->a[i].pExpr, t
210d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
210e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
210f0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
21100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21110 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
21120 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
21130 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
21140 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
21150 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55  ..      /* The U
21160 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69  NLIKELY() functi
21170 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
21180 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
21190 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
211a0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
211b0 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
211c0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
211d0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
211e0 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
211f0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  Y ){.        ass
21200 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b  ert( nFarg>=1 );
21210 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21220 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
21230 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 46  arget(pParse, pF
21240 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
21250 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21260 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
21270 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20  _DEBUG.      /* 
21280 54 68 65 20 41 46 46 49 4e 49 54 59 28 29 20 66  The AFFINITY() f
21290 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74 65  unction evaluate
212a0 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68  s to a string th
212b0 61 74 20 64 65 73 63 72 69 62 65 73 0a 20 20 20  at describes.   
212c0 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20 61     ** the type a
212d0 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 61  ffinity of the a
212e0 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 69  rgument.  This i
212f0 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
21300 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ng of.      ** t
21310 68 65 20 53 51 4c 69 74 65 20 74 79 70 65 20 6c  he SQLite type l
21320 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ogic..      */. 
21330 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
21340 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
21350 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 20  E_FUNC_AFFINITY 
21360 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
21370 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d   char *azAff[] =
21380 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78 74   { "blob", "text
21390 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22 69  ", "numeric", "i
213a0 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22 20  nteger", "real" 
213b0 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  };.        char 
213c0 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73  aff;.        ass
213d0 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
213e0 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 73  .        aff = s
213f0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
21400 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  ty(pFarg->a[0].p
21410 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
21420 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
21430 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20  ring(v, target, 
21440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
21460 66 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53  ff ? azAff[aff-S
21470 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20  QLITE_AFF_BLOB] 
21480 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20  : "none");.     
21490 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
214a0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
214b0 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
214c0 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
214d0 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32          if( i<32
214e0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
214f0 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d  sConstant(pFarg-
21500 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
21510 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21520 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20  se( i==31 );.   
21530 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
21540 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29   |= MASKBIT32(i)
21550 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21560 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
21570 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
21580 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29  E_FUNC_NEEDCOLL)
21590 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  !=0 && !pColl ){
215a0 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
215b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
215c0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46  llSeq(pParse, pF
215d0 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
215e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
215f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
21600 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arg ){.        i
21610 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a  f( constMask ){.
21620 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70            r1 = p
21630 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
21640 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
21650 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a  >nMem += nFarg;.
21660 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21670 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71           r1 = sq
21680 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
21690 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29  e(pParse, nFarg)
216a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
216b0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67       /* For leng
216c0 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28  th() and typeof(
216d0 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68  ) functions with
216e0 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65   a column argume
216f0 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  nt,.        ** s
21700 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65  et the P5 parame
21710 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f  ter to the OP_Co
21720 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f  lumn opcode to O
21730 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a  PFLAG_LENGTHARG.
21740 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50          ** or OP
21750 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72  FLAG_TYPEOFARG r
21760 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20  espectively, to 
21770 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72  avoid unnecessar
21780 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a  y data.        *
21790 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20  * loading..     
217a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
217b0 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
217c0 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e  gs & (SQLITE_FUN
217d0 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f  C_LENGTH|SQLITE_
217e0 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30  FUNC_TYPEOF))!=0
217f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
21800 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20   exprOp;.       
21810 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
21820 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
21830 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e   assert( pFarg->
21840 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
21850 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f  .          exprO
21860 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  p = pFarg->a[0].
21870 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20  pExpr->op;.     
21880 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d       if( exprOp=
21890 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78  =TK_COLUMN || ex
218a0 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  prOp==TK_AGG_COL
218b0 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
218c0 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
218d0 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f  E_FUNC_LENGTH==O
218e0 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
218f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
21900 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
21910 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41  NC_TYPEOF==OPFLA
21920 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20  G_TYPEOFARG );. 
21930 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
21940 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46  ase( pDef->funcF
21950 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45  lags & OPFLAG_LE
21960 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
21970 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b         pFarg->a[
21980 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20  0].pExpr->op2 = 
21990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
219a0 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61     pDef->funcFla
219b0 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e  gs & (OPFLAG_LEN
219c0 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59  GTHARG|OPFLAG_TY
219d0 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
219e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
219f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21a00 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
21a10 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69  arse);     /* Ti
21a20 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
21a30 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  e */.        sql
21a40 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
21a50 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61  List(pParse, pFa
21a60 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20 20  rg, r1, 0,.     
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a80 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
21a90 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54  E_ECEL_DUP|SQLIT
21aa0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a  E_ECEL_FACTOR);.
21ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21ac0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
21ad0 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63  se);      /* Tic
21ae0 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
21af0 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
21b00 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b  .        r1 = 0;
21b10 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
21b20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
21b30 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
21b40 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72  /* Possibly over
21b50 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f  load the functio
21b60 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61  n if the first a
21b70 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20  rgument is.     
21b80 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61   ** a virtual ta
21b90 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  ble column..    
21ba0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
21bb0 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  r infix function
21bc0 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52  s (LIKE, GLOB, R
21bd0 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48  EGEXP, and MATCH
21be0 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  ) use the.      
21bf0 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
21c00 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73  nt, not the firs
21c10 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  t, as the argume
21c20 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20  nt to test to.  
21c30 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
21c40 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
21c50 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
21c60 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62    This is done b
21c70 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
21c80 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
21c90 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69   of infix functi
21ca0 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64  ons (the operand
21cb0 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20   we want to.    
21cc0 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65    ** control ove
21cd0 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75  rloading) ends u
21ce0 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  p as the second 
21cf0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
21d00 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
21d10 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  n.  The expressi
21d20 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73  on "A glob B" is
21d30 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
21d40 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42        ** "glob(B
21d50 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f  ,A).  We want to
21d60 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41   use the A in "A
21d70 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74   glob B" to test
21d80 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75  .      ** for fu
21d90 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
21da0 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20  ng.  But we use 
21db0 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67  the B term in "g
21dc0 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20  lob(B,A)"..     
21dd0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46   */.      if( nF
21de0 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72  arg>=2 && (pExpr
21df0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66  ->flags & EP_Inf
21e00 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  ixFunc) ){.     
21e10 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
21e20 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
21e30 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
21e40 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
21e50 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
21e60 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67   }else if( nFarg
21e70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
21e80 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
21e90 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
21ea0 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
21eb0 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
21ec0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  xpr);.      }.#e
21ed0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
21ee0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
21ef0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
21f00 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
21f10 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
21f20 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
21f30 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
21f40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
21f50 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
21f60 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
21f70 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
21f80 51 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64  Q);.      }.#ifd
21f90 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
21fa0 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43  _OFFSET_SQL_FUNC
21fb0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
21fc0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
21fd0 49 54 45 5f 46 55 4e 43 5f 4f 46 46 53 45 54 20  ITE_FUNC_OFFSET 
21fe0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
21ff0 2a 70 41 72 67 20 3d 20 70 46 61 72 67 2d 3e 61  *pArg = pFarg->a
22000 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
22010 20 20 20 69 66 28 20 70 41 72 67 2d 3e 6f 70 3d     if( pArg->op=
22020 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
22030 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22040 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
22050 4f 66 66 73 65 74 2c 20 70 41 72 67 2d 3e 69 54  Offset, pArg->iT
22060 61 62 6c 65 2c 20 70 41 72 67 2d 3e 69 43 6f 6c  able, pArg->iCol
22070 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
22080 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22090 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
220a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
220b0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
220c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
220d0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
220e0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73 71      {.        sq
220f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
22100 76 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66  v, pParse->iSelf
22110 54 61 62 20 3f 20 4f 50 5f 50 75 72 65 46 75 6e  Tab ? OP_PureFun
22120 63 30 20 3a 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  c0 : OP_Function
22130 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
22150 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67  stMask, r1, targ
22160 65 74 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c  et, (char*)pDef,
22170 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
22180 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22190 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
221a0 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d  )nFarg);.      }
221b0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
221c0 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30   && constMask==0
221d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
221e0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
221f0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
22200 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  nFarg);.      }.
22210 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
22220 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  get;.    }.#ifnd
22230 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
22240 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
22250 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
22260 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
22270 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
22280 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22290 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ( op==TK_EXISTS 
222a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
222b0 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  e( op==TK_SELECT
222c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70   );.      if( op
222d0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 28  ==TK_SELECT && (
222e0 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e  nCol = pExpr->x.
222f0 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
22300 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20 20  >nExpr)!=1 ){.  
22310 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62        sqlite3Sub
22320 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  selectError(pPar
22330 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20  se, nCol, 1);.  
22340 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22350 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
22360 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
22370 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
22380 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
22390 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
223a0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
223b0 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  CT_COLUMN: {.   
223c0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
223d0 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
223e0 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ->iTable==0 ){. 
223f0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
22400 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71  eft->iTable = sq
22410 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
22420 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
22430 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a  ->pLeft, 0, 0);.
22440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
22450 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
22460 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
22470 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53  >pLeft->op==TK_S
22480 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69  ELECT );.      i
22490 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
224a0 0a 20 20 20 20 20 20 20 26 26 20 70 45 78 70 72  .       && pExpr
224b0 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73  ->iTable!=(n = s
224c0 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
224d0 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  Size(pExpr->pLef
224e0 74 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  t)) .      ){.  
224f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
22500 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
22510 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e  d columns assign
22520 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20  ed %d values",. 
22530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22550 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29  Expr->iTable, n)
22560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22570 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c  return pExpr->pL
22580 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45  eft->iTable + pE
22590 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
225a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
225b0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
225c0 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
225d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
225e0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
225f0 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
22600 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
22610 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
22620 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22630 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
22640 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
22650 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
22660 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
22670 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
22680 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
22690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
226a0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
226b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
226c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
226d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
226e0 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
226f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22700 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
22710 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20  target, 0);.    
22720 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
22730 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
22740 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
22750 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
22760 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
22770 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
22780 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a  ERY */...    /*.
22790 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
227a0 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
227b0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
227c0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
227d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
227e0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
227f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
22800 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
22810 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
22820 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
22830 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
22840 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
22850 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
22860 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
22870 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
22880 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
22890 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78  WEEN: {.      ex
228a0 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
228b0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
228c0 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  get, 0, 0);.    
228d0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
228e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
228f0 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61 73  TK_SPAN:.    cas
22900 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20  e TK_COLLATE: . 
22910 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
22920 3a 20 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20  : {.      pExpr 
22930 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
22940 20 20 20 20 20 20 67 6f 74 6f 20 65 78 70 72 5f        goto expr_
22950 63 6f 64 65 5f 64 6f 6f 76 65 72 3b 20 2f 2a 20  code_doover; /* 
22960 32 30 31 38 2d 30 34 2d 32 38 3a 20 50 72 65 76  2018-04-28: Prev
22970 65 6e 74 20 64 65 65 70 20 72 65 63 75 72 73 69  ent deep recursi
22980 6f 6e 2e 20 4f 53 53 46 75 7a 7a 2e 20 2a 2f 0a  on. OSSFuzz. */.
22990 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
229a0 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20  TK_TRIGGER: {.  
229b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
229c0 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47  code is TK_TRIGG
229d0 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ER, then the exp
229e0 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66  ression is a ref
229f0 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20  erence.      ** 
22a00 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  to a column in t
22a10 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e  he new.* or old.
22a20 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20  * pseudo-tables 
22a30 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20  available to.   
22a40 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72     ** trigger pr
22a50 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20  ograms. In this 
22a60 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65  case Expr.iTable
22a70 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
22a80 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
22a90 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
22aa0 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f  , or 0 for the o
22ab0 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
22ac0 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a  e. Expr.iColumn.
22ad0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
22ae0 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  to the column of
22af0 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
22b00 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f  e to read, or to
22b10 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   -1 to.      ** 
22b20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66  read the rowid f
22b30 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ield..      **. 
22b40 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72       ** The expr
22b50 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  ession is implem
22b60 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f  ented using an O
22b70 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20  P_Param opcode. 
22b80 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  The p1.      ** 
22b90 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
22ba0 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64   to 0 for an old
22bb0 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
22bc0 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20  , or to (i+1).  
22bd0 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65      ** to refere
22be0 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75  nce another colu
22bf0 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20  mn of the old.* 
22c00 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68  pseudo-table, wh
22c10 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20  ere .      ** i 
22c20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
22c30 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20  the column. For 
22c40 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65  a new.rowid refe
22c50 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20  rence, p1 is.   
22c60 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b     ** set to (n+
22c70 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74  1), where n is t
22c80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
22c90 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65  umns in each pse
22ca0 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20  udo-table..     
22cb0 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65   ** For a refere
22cc0 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72  nce to any other
22cd0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
22ce0 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
22cf0 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69  e, p1.      ** i
22d00 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29  s set to (n+2+i)
22d10 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20  , where n and i 
22d20 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70  are as defined p
22d30 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20  reviously. For. 
22d40 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c       ** example,
22d50 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e   if the table on
22d60 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20   which triggers 
22d70 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20  are being fired 
22d80 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c  is.      ** decl
22d90 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a  ared as:.      *
22da0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45  *.      **   CRE
22db0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
22dc0 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  b);.      **.   
22dd0 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73     ** Then p1 is
22de0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
22df0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a  follows:.      *
22e00 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  *.      **   p1=
22e10 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72  =0   ->    old.r
22e20 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20  owid     p1==3  
22e30 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64   ->    new.rowid
22e40 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
22e50 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20  1   ->    old.a 
22e60 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20          p1==4   
22e70 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20  ->    new.a.    
22e80 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d    **   p1==2   -
22e90 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20  >    old.b      
22ea0 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20     p1==5   ->   
22eb0 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20   new.b       .  
22ec0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
22ed0 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
22ee0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e  ->pTab;.      in
22ef0 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54  t p1 = pExpr->iT
22f00 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43  able * (pTab->nC
22f10 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70  ol+1) + 1 + pExp
22f20 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20  r->iColumn;..   
22f30 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
22f40 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70  ->iTable==0 || p
22f50 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20  Expr->iTable==1 
22f60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22f70 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
22f80 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43  =-1 && pExpr->iC
22f90 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c  olumn<pTab->nCol
22fa0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
22fb0 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
22fc0 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  || pExpr->iColum
22fd0 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  n!=pTab->iPKey )
22fe0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22ff0 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61  p1>=0 && p1<(pTa
23000 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a  b->nCol*2+2) );.
23010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23020 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50  beAddOp2(v, OP_P
23030 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74  aram, p1, target
23040 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
23050 6d 65 6e 74 28 28 76 2c 20 22 72 5b 25 64 5d 3d  ment((v, "r[%d]=
23060 25 73 2e 25 73 22 2c 20 74 61 72 67 65 74 2c 0a  %s.%s", target,.
23070 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
23080 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a  iTable ? "new" :
23090 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20   "old"),.       
230a0 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   (pExpr->iColumn
230b0 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70  <0 ? "rowid" : p
230c0 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  Expr->pTab->aCol
230d0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
230e0 2e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 29 29  .zName).      ))
230f0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
23100 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
23110 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49  POINT.      /* I
23120 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  f the column has
23130 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20   REAL affinity, 
23140 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  it may currently
23150 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e   be stored as an
23160 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
23170 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66  r. Use OP_RealAf
23180 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73  finity to make s
23190 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79  ure it is really
231a0 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a   real..      **.
231b0 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
231c0 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37  E-OF: R-60985-57
231d0 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  662 SQLite will 
231e0 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75  convert the valu
231f0 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20  e back to.      
23200 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
23210 74 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e  t when extractin
23220 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65  g it from the re
23230 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cord.  */.      
23240 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
23250 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26  mn>=0 .       &&
23260 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70   pTab->aCol[pExp
23270 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  r->iColumn].affi
23280 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
23290 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20  _REAL.      ){. 
232a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
232b0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
232c0 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72  ealAffinity, tar
232d0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  get);.      }.#e
232e0 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
232f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
23300 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20  e TK_VECTOR: {. 
23310 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
23320 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f  rMsg(pParse, "ro
23330 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
23340 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
23350 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
23360 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20  TK_IF_NULL_ROW: 
23370 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
23380 49 4e 52 3b 0a 20 20 20 20 20 20 61 64 64 72 49  INR;.      addrI
23390 4e 52 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  NR = sqlite3Vdbe
233a0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
233b0 75 6c 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69  ullRow, pExpr->i
233c0 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  Table);.      sq
233d0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
233e0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
233f0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
23400 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
23410 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
23420 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
23430 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23440 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
23450 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
23460 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
23470 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20 73  ddrINR);.      s
23480 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
23490 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20 69  P3(v, addrINR, i
234a0 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
234b0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
234c0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
234d0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
234e0 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
234f0 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
23500 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
23510 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
23520 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
23530 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
23540 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
23550 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
23560 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
23570 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
23580 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
23590 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
235a0 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
235b0 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
235c0 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
235d0 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
235e0 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
235f0 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
23600 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
23610 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
23620 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
23630 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
23640 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
23650 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
23660 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
23670 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74  Y is in the last
23680 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70   element of pExp
23690 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45  r->x.pList if pE
236a0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
236b0 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64  xpr is.    ** od
236c0 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73  d.  The Y is als
236d0 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20  o optional.  If 
236e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
236f0 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73  ements in x.pLis
23700 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e  t.    ** is even
23710 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74  , then Y is omit
23720 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68  ted and the "oth
23730 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69  erwise" result i
23740 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
23750 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
23760 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
23770 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
23780 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
23790 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
237a0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
237b0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
237c0 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
237d0 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
237e0 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
237f0 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
23800 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
23810 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
23820 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
23830 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
23840 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
23850 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
23860 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
23870 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23890 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
238a0 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
238b0 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
238c0 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
238f0 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
23900 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
23910 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23930 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
23940 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
23950 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23970 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
23980 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
23990 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
239a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
239b0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
239c0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
239d0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
239e0 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
239f0 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
23a00 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
23a10 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
23a20 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
23a30 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
23a40 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
23a50 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
23a80 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
23a90 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74       Expr *pTest
23aa0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23ab0 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20         /* X==Ei 
23ac0 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74  (form A) or just
23ad0 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a   Ei (form B) */.
23ae0 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20        VVA_ONLY( 
23af0 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20  int iCacheLevel 
23b00 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
23b10 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20  Level; )..      
23b20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
23b30 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
23b40 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26  EP_xIsSelect) &&
23b50 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
23b60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23b70 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
23b80 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20  nExpr > 0);.    
23b90 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
23ba0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
23bb0 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c   aListelem = pEL
23bc0 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45  ist->a;.      nE
23bd0 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
23be0 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61  xpr;.      endLa
23bf0 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bel = sqlite3Vdb
23c00 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
23c10 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70       if( (pX = p
23c20 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
23c30 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  ){.        tempX
23c40 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20   = *pX;.        
23c50 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
23c60 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
23c70 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67         exprToReg
23c80 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78  ister(&tempX, ex
23c90 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
23ca0 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
23cb0 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20  gFree1));.      
23cc0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
23cd0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
23ce0 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d     memset(&opCom
23cf0 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pare, 0, sizeof(
23d00 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20  opCompare));.   
23d10 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
23d20 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
23d30 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
23d40 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20  ft = &tempX;.   
23d50 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
23d60 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
23d70 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
23d80 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
23d90 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
23da0 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
23db0 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
23dc0 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
23dd0 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
23de0 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
23df0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
23e00 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
23e10 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
23e20 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
23e30 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
23e40 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
23e50 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
23e60 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
23e70 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
23e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23e90 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
23ea0 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  -1; i=i+2){.    
23eb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
23ec0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
23ed0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  ;.        if( pX
23ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
23ef0 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29  sert( pTest!=0 )
23f00 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f  ;.          opCo
23f10 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61  mpare.pRight = a
23f20 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
23f30 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
23f40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73  {.          pTes
23f50 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
23f60 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
23f70 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61  }.        nextCa
23f80 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
23f90 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
23fa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23fb0 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pTest->op==TK_CO
23fc0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
23fd0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
23fe0 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74  se(pParse, pTest
23ff0 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49  , nextCase, SQLI
24000 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
24010 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
24020 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
24030 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  .pExpr->op==TK_C
24040 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
24050 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24060 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
24070 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74  em[i+1].pExpr, t
24080 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
24090 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
240a0 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  v, endLabel);.  
240b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
240c0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
240d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
240e0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
240f0 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b  el(v, nextCase);
24100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24110 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20  f( (nExpr&1)!=0 
24120 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
24130 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
24140 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
24150 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24160 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
24170 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70  >a[nExpr-1].pExp
24180 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
24190 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
241a0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
241b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
241c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
241d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
241e0 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
241f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
24200 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
24210 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
24220 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
24230 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
24240 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
24250 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c  vel==iCacheLevel
24260 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
24270 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
24280 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  l(v, endLabel);.
24290 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
242a0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
242b0 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
242c0 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
242d0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
242e0 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
242f0 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a  y==OE_Rollback .
24300 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
24310 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
24320 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20  E_Abort.        
24330 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
24340 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20  inity==OE_Fail. 
24350 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
24360 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
24370 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b  _Ignore.      );
24380 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
24390 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
243a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
243b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
243c0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
243d0 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
243e0 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
243f0 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
24400 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
24410 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
24420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24430 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
24440 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ity==OE_Abort ){
24450 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24460 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
24470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24480 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
24490 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
244a0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
244b0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
244c0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
244d0 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
244e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
244f0 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  4(.            v
24500 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
24510 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  E_OK, OE_Ignore,
24520 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
24530 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ken,0);.        
24540 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
24550 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24560 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c        sqlite3Hal
24570 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
24580 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  se, SQLITE_CONST
24590 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20  RAINT_TRIGGER,. 
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
245c0 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45  pr->affinity, pE
245d0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
245e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
245f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24600 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  }.#endif.  }.  s
24610 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
24620 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
24630 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
24640 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
24650 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
24660 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65  );.  return inRe
24670 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74  g;.}../*.** Fact
24680 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20  or out the code 
24690 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
246a0 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69  ression to initi
246b0 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a  alization time..
246c0 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73 74  **.** If regDest
246d0 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65 73  >=0 then the res
246e0 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73 74  ult is always st
246f0 6f 72 65 64 20 69 6e 20 74 68 61 74 20 72 65 67  ored in that reg
24700 69 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a 2a  ister and the.**
24710 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 72   result is not r
24720 65 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65 67  eusable.  If reg
24730 44 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69 73  Dest<0 then this
24740 20 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65 65   routine is free
24750 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74 68   to .** store th
24760 65 20 76 61 6c 75 65 20 77 68 65 72 65 65 76 65  e value whereeve
24770 72 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68 65  r it wants.  The
24780 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20   register where 
24790 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a  the expression .
247a0 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73 20  ** is stored is 
247b0 72 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e 20  returned.  When 
247c0 72 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20 69  regDest<0, two i
247d0 64 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73 73  dentical express
247e0 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64  ions will.** cod
247f0 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65  e to the same re
24800 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  gister..*/.int s
24810 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
24820 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70  Init(.  Parse *p
24830 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
24840 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
24850 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
24860 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
24870 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68  ssion to code wh
24880 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74  en the VDBE init
24890 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74  ializes */.  int
248a0 20 72 65 67 44 65 73 74 20 20 20 20 20 20 20 2f   regDest       /
248b0 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75  * Store the valu
248c0 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  e in this regist
248d0 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  er */.){.  ExprL
248e0 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  ist *p;.  assert
248f0 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
24900 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d  pParse) );.  p =
24910 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
24920 78 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44 65  xpr;.  if( regDe
24930 73 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20 20  st<0 && p ){.   
24940 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
24950 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
24960 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
24970 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70  (pItem=p->a, i=p
24980 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49  ->nExpr; i>0; pI
24990 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20  tem++, i--){.   
249a0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65     if( pItem->re
249b0 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65  usable && sqlite
249c0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 70  3ExprCompare(0,p
249d0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70  Item->pExpr,pExp
249e0 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r,-1)==0 ){.    
249f0 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
24a00 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
24a10 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  g;.      }.    }
24a20 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 73  .  }.  pExpr = s
24a30 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
24a40 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
24a50 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   0);.  p = sqlit
24a60 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
24a70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70  (pParse, p, pExp
24a80 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  r);.  if( p ){. 
24a90 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
24aa0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
24ab0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  = &p->a[p->nExpr
24ac0 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  -1];.     pItem-
24ad0 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67 44  >reusable = regD
24ae0 65 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28 20  est<0;.     if( 
24af0 72 65 67 44 65 73 74 3c 30 20 29 20 72 65 67 44  regDest<0 ) regD
24b00 65 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  est = ++pParse->
24b10 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d  nMem;.     pItem
24b20 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
24b30 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 7d  g = regDest;.  }
24b40 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  .  pParse->pCons
24b50 74 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65 74  tExpr = p;.  ret
24b60 75 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a  urn regDest;.}..
24b70 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
24b80 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
24b90 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  an expression an
24ba0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
24bb0 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  lts.** into a re
24bc0 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20  gister.  Return 
24bd0 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
24be0 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65  ber where the re
24bf0 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f  sults.** are sto
24c00 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
24c10 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  e register is a 
24c20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
24c30 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  er that can be d
24c40 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74  eallocated,.** t
24c50 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75  hen write its nu
24c60 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e  mber into *pReg.
24c70 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
24c80 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a  register is not.
24c90 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20  ** a temporary, 
24ca0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74  then set *pReg t
24cb0 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  o zero..**.** If
24cc0 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73   pExpr is a cons
24cd0 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  tant, then this 
24ce0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65  routine might ge
24cf0 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63  nerate this.** c
24d00 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20  ode to fill the 
24d10 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
24d20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73  initialization s
24d30 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ection of the.**
24d40 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69   VDBE program, i
24d50 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f  n order to facto
24d60 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20  r it out of the 
24d70 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e  evaluation loop.
24d80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
24d90 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73  xprCodeTemp(Pars
24da0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
24db0 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65  *pExpr, int *pRe
24dc0 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20  g){.  int r2;.  
24dd0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
24de0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
24df0 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e  Expr);.  if( Con
24e00 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
24e10 65 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  e).   && pExpr->
24e20 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a  op!=TK_REGISTER.
24e30 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
24e40 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
24e50 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20  in(pExpr).  ){. 
24e60 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20     *pReg  = 0;. 
24e70 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
24e80 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
24e90 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29  arse, pExpr, -1)
24ea0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
24eb0 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
24ec0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
24ed0 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69  );.    r2 = sqli
24ee0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
24ef0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
24f00 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32   r1);.    if( r2
24f10 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70  ==r1 ){.      *p
24f20 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65  Reg = r1;.    }e
24f30 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
24f40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
24f50 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
24f60 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20      *pReg = 0;. 
24f70 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
24f80 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n r2;.}../*.** G
24f90 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
24fa0 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
24fb0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
24fc0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
24fd0 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
24fe0 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
24ff0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
25000 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
25010 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
25020 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f  er target..*/.vo
25030 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
25040 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
25050 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
25060 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e  nt target){.  in
25070 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65  t inReg;..  asse
25080 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
25090 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
250a0 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45  nMem );.  if( pE
250b0 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  xpr && pExpr->op
250c0 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  ==TK_REGISTER ){
250d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
250e0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
250f0 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  Vdbe, OP_Copy, p
25100 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
25110 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
25120 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
25130 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
25140 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
25150 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73   target);.    as
25160 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
25170 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  dbe!=0 || pParse
25180 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
25190 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  ed );.    if( in
251a0 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70  Reg!=target && p
251b0 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
251c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
251d0 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
251e0 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c  pVdbe, OP_SCopy,
251f0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
25200 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
25210 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73  .** Make a trans
25220 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70  ient copy of exp
25230 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
25240 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75  d then code it u
25250 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45  sing.** sqlite3E
25260 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73  xprCode().  This
25270 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a   routine works j
25280 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33  ust like sqlite3
25290 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78  ExprCode().** ex
252a0 63 65 70 74 20 74 68 61 74 20 74 68 65 20 69 6e  cept that the in
252b0 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  put expression i
252c0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
252d0 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  be unchanged..*/
252e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
252f0 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20  rCodeCopy(Parse 
25300 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
25310 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
25320 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
25330 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
25340 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
25350 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
25360 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62  r, 0);.  if( !db
25370 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
25380 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25390 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
253a0 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74  target);.  sqlit
253b0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
253c0 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
253d0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
253e0 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
253f0 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
25400 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
25410 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
25420 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
25430 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
25440 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
25450 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
25460 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49  ister target.  I
25470 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
25480 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68   is constant, th
25490 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
254a0 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20  ** might choose 
254b0 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72  to code the expr
254c0 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61  ession at initia
254d0 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
254e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
254f0 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65  prCodeFactorable
25500 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
25510 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
25520 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20   target){.  if( 
25530 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
25540 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33  actor && sqlite3
25550 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
25560 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  Expr) ){.    sql
25570 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
25580 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
25590 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c  , target);.  }el
255a0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
255b0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
255c0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
255d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
255e0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
255f0 65 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69  evaluates the gi
25600 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
25610 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75  nd puts the resu
25620 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  lt.** in registe
25630 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  r target..**.** 
25640 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  Also make a copy
25650 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
25660 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  on results into 
25670 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20  another "cache" 
25680 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
25690 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65  modify the expre
256a0 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ssion so that th
256b0 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69  e next time it i
256c0 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20  s evaluated,.** 
256d0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  the result is a 
256e0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68  copy of the cach
256f0 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  e register..**.*
25700 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
25710 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
25720 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
25730 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  used multiple .*
25740 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61  * times.  They a
25750 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  re evaluated onc
25760 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
25770 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  s of the express
25780 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65  ion.** are reuse
25790 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
257a0 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
257b0 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
257c0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
257d0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
257e0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
257f0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65  pVdbe;.  int iMe
25800 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  m;..  assert( ta
25810 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
25820 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
25830 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
25840 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
25850 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
25860 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d  arget);.  iMem =
25870 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
25880 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
25890 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
258a0 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a   target, iMem);.
258b0 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
258c0 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d  (pExpr, iMem);.}
258d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
258e0 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
258f0 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
25900 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
25910 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
25920 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
25930 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
25940 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
25950 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
25960 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
25970 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
25980 74 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20 54  ts evaluated.  T
25990 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
259a0 65 64 20 77 69 6c 6c 0a 2a 2a 20 75 73 75 61 6c  ed will.** usual
259b0 6c 79 20 62 65 20 70 4c 69 73 74 2d 3e 6e 45 78  ly be pList->nEx
259c0 70 72 20 62 75 74 20 6d 69 67 68 74 20 62 65 20  pr but might be 
259d0 72 65 64 75 63 65 64 20 69 66 20 53 51 4c 49 54  reduced if SQLIT
259e0 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 0a 2a  E_ECEL_OMITREF.*
259f0 2a 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  * is defined..**
25a00 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
25a10 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65  CEL_DUP flag pre
25a20 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65  vents the argume
25a30 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  nts from being.*
25a40 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f  * filled using O
25a50 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70  P_SCopy.  OP_Cop
25a60 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69  y must be used i
25a70 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstead..**.** Th
25a80 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  e SQLITE_ECEL_FA
25a90 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c  CTOR argument al
25aa0 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72  lows constant ar
25ab0 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a  guments to be.**
25ac0 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e   factored out in
25ad0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
25ae0 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n code..**.** Th
25af0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  e SQLITE_ECEL_RE
25b00 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  F flag means tha
25b10 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  t expressions in
25b20 20 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a   the list with.*
25b30 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75  * ExprList.a[].u
25b40 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
25b50 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
25b60 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  en evaluated and
25b70 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65   stored.** in re
25b80 67 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65  gisters at srcRe
25b90 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61  g, and so the va
25ba0 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65  lue can be copie
25bb0 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2a  d from there..**
25bc0 20 49 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   If SQLITE_ECEL_
25bd0 4f 4d 49 54 52 45 46 20 69 73 20 61 6c 73 6f 20  OMITREF is also 
25be0 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  set, then the va
25bf0 6c 75 65 73 20 77 69 74 68 20 75 2e 78 2e 69 4f  lues with u.x.iO
25c00 72 64 65 72 42 79 43 6f 6c 3e 30 0a 2a 2a 20 61  rderByCol>0.** a
25c10 72 65 20 73 69 6d 70 6c 79 20 6f 6d 69 74 74 65  re simply omitte
25c20 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 62 65  d rather than be
25c30 69 6e 67 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  ing copied from 
25c40 73 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e 74 20 73  srcReg..*/.int s
25c50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
25c60 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
25c70 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
25c80 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
25c90 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
25ca0 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65  List,   /* The e
25cb0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
25cc0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
25cd0 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20  int target,     
25ce0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
25cf0 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a  rite results */.
25d00 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20    int srcReg,   
25d10 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72       /* Source r
25d20 65 67 69 73 74 65 72 73 20 69 66 20 53 51 4c 49  egisters if SQLI
25d30 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20  TE_ECEL_REF */. 
25d40 20 75 38 20 66 6c 61 67 73 20 20 20 20 20 20 20   u8 flags       
25d50 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43      /* SQLITE_EC
25d60 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  EL_* flags */.){
25d70 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
25d80 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
25d90 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20    int i, j, n;. 
25da0 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c   u8 copyOp = (fl
25db0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
25dc0 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79  L_DUP) ? OP_Copy
25dd0 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56   : OP_SCopy;.  V
25de0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
25df0 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
25e00 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
25e10 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
25e20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25e30 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29  arse->pVdbe!=0 )
25e40 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73  ;  /* Never gets
25e50 20 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77   this far otherw
25e60 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69  ise */.  n = pLi
25e70 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28  st->nExpr;.  if(
25e80 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28   !ConstFactorOk(
25e90 70 50 61 72 73 65 29 20 29 20 66 6c 61 67 73 20  pParse) ) flags 
25ea0 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f  &= ~SQLITE_ECEL_
25eb0 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49  FACTOR;.  for(pI
25ec0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
25ed0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74  0; i<n; i++, pIt
25ee0 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
25ef0 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  *pExpr = pItem->
25f00 70 45 78 70 72 3b 0a 23 69 66 64 65 66 20 53 51  pExpr;.#ifdef SQ
25f10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
25f20 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
25f30 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 62 53 6f    if( pItem->bSo
25f40 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20  rterRef ){.     
25f50 20 69 2d 2d 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b   i--;.      n--;
25f60 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
25f70 66 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  f.    if( (flags
25f80 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52   & SQLITE_ECEL_R
25f90 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20 70  EF)!=0 && (j = p
25fa0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
25fb0 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20  ByCol)>0 ){.    
25fc0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
25fd0 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
25fe0 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2d 2d  F ){.        i--
25ff0 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20  ;.        n--;. 
26000 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26020 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
26030 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74 61 72   j+srcReg-1, tar
26040 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a  get+i);.      }.
26050 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
26060 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
26070 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26  EL_FACTOR)!=0 &&
26080 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
26090 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b  nstant(pExpr) ){
260a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
260b0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
260c0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
260d0 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  et+i);.    }else
260e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65  {.      int inRe
260f0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
26100 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
26110 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
26120 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  i);.      if( in
26130 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b  Reg!=target+i ){
26140 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
26150 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  *pOp;.        if
26160 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70  ( copyOp==OP_Cop
26170 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  y.         && (p
26180 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65  Op=sqlite3VdbeGe
26190 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63  tOp(v, -1))->opc
261a0 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  ode==OP_Copy.   
261b0 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
261c0 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65  +pOp->p3+1==inRe
261d0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  g.         && pO
261e0 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p2+pOp->p3+1=
261f0 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20  =target+i.      
26200 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
26210 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20  Op->p3++;.      
26220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26240 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
26250 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29  inReg, target+i)
26260 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26270 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
26280 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
26290 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
262a0 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f   for a BETWEEN o
262b0 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  perator..**.**  
262c0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
262d0 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  D z.**.** The ab
262e0 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ove is equivalen
262f0 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78  t to .**.**    x
26300 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a  >=y AND x<=z.**.
26310 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
26320 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
26330 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
26340 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
26350 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66  * elimination of
26360 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a   x..**.** The xJ
26370 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72 20  umpIf parameter 
26380 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61 69  determines detai
26390 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c  ls:.**.**    NUL
263a0 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
263b0 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 62       Store the b
263c0 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69 6e  oolean result in
263d0 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20   reg[dest].**   
263e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
263f0 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74 6f  ue:      Jump to
26400 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a 2a   dest if true.**
26410 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26420 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70  fFalse:     Jump
26430 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c 73   to dest if fals
26440 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70  e.**.** The jump
26450 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65 72  IfNull parameter
26460 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 78   is ignored if x
26470 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a  JumpIf is NULL..
26480 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
26490 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
264a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
264b0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
264c0 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
264d0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
264e0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
264f0 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
26500 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
26510 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
26520 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69     /* Jump desti
26530 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67  nation or storag
26540 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  e location */.  
26550 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50 61  void (*xJump)(Pa
26560 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69  rse*,Expr*,int,i
26570 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74  nt), /* Action t
26580 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20  o take */.  int 
26590 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
265a0 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
265b0 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
265c0 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70   NULL */.){. Exp
265d0 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f  r exprAnd;     /
265e0 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74  * The AND operat
265f0 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20  or in  x>=y AND 
26600 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20  x<=z  */.  Expr 
26610 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20  compLeft;    /* 
26620 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20  The  x>=y  term 
26630 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69  */.  Expr compRi
26640 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78  ght;   /* The  x
26650 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  <=z  term */.  E
26660 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20  xpr exprX;      
26670 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65   /* The  x  sube
26680 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
26690 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
266a0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
266b0 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a  e register */...
266c0 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65    memset(&compLe
266d0 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ft, 0, sizeof(Ex
266e0 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
266f0 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69  compRight, 0, si
26700 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d  zeof(Expr));.  m
26710 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20  emset(&exprAnd, 
26720 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
26730 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  ;..  assert( !Ex
26740 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
26750 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
26760 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20  t) );.  exprX = 
26770 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
26780 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
26790 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e  _AND;.  exprAnd.
267a0 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
267b0 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69  t;.  exprAnd.pRi
267c0 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
267d0 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20  ;.  compLeft.op 
267e0 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c  = TK_GE;.  compL
267f0 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
26800 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  rX;.  compLeft.p
26810 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
26820 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
26830 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  pr;.  compRight.
26840 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
26850 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
26860 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
26870 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
26880 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
26890 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54  ].pExpr;.  exprT
268a0 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58  oRegister(&exprX
268b0 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  , exprCodeVector
268c0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c  (pParse, &exprX,
268d0 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20   &regFree1));.  
268e0 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20  if( xJump ){.   
268f0 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20 26   xJump(pParse, &
26900 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
26910 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
26920 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  lse{.    /* Mark
26930 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
26940 69 73 20 62 65 69 6e 67 20 66 72 6f 6d 20 74 68  is being from th
26950 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
26960 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a 20  ause of a join. 
26970 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68     ** so that th
26980 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
26990 65 54 61 72 67 65 74 28 29 20 72 6f 75 74 69 6e  eTarget() routin
269a0 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
269b0 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20 2a  pt to move.    *
269c0 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20 50 61  * it into the Pa
269d0 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72 20 6c  rse.pConstExpr l
269e0 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  ist.  We should 
269f0 75 73 65 20 61 20 6e 65 77 20 62 69 74 20 66 6f  use a new bit fo
26a00 72 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a 20 66  r this,.    ** f
26a10 6f 72 20 63 6c 61 72 69 74 79 2c 20 62 75 74 20  or clarity, but 
26a20 77 65 20 61 72 65 20 6f 75 74 20 6f 66 20 62 69  we are out of bi
26a30 74 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e 66  ts in the Expr.f
26a40 6c 61 67 73 20 66 69 65 6c 64 20 73 6f 20 77 65  lags field so we
26a50 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f 20  .    ** have to 
26a60 72 65 75 73 65 20 74 68 65 20 45 50 5f 46 72 6f  reuse the EP_Fro
26a70 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d 6d  mJoin bit.  Bumm
26a80 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70 72 58  er. */.    exprX
26a90 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f  .flags |= EP_Fro
26aa0 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74  mJoin;.    sqlit
26ab0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
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 29 3b 0a 20 20 7d 0a 20 20  d, dest);.  }.  
26ae0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
26af0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
26b00 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45  gFree1);..  /* E
26b10 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74  nsure adequate t
26b20 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  est coverage */.
26b30 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26b40 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26b50 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
26b60 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
26b70 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
26b80 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
26b90 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
26ba0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
26bb0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
26bc0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
26bd0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
26be0 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
26bf0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
26c00 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
26c10 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
26c20 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
26c30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
26c40 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
26c50 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
26c60 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
26c70 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
26c80 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
26c90 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
26ca0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
26cb0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26cc0 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
26cd0 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
26ce0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
26cf0 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
26d00 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
26d10 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
26d20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
26d30 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
26d40 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
26d50 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
26d60 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
26d70 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
26d80 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a  se( xJump==0 );.
26d90 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
26da0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
26db0 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
26dc0 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
26dd0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
26de0 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
26df0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
26e00 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
26e10 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
26e20 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
26e30 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
26e40 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
26e50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
26e60 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
26e70 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
26e80 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
26e90 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
26ea0 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
26eb0 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
26ec0 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
26ed0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
26ee0 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
26ef0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
26f00 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
26f10 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
26f20 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
26f30 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
26f40 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
26f50 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
26f60 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
26f70 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
26f80 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
26f90 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
26fa0 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
26fb0 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
26fc0 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
26fd0 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
26fe0 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
26ff0 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
27000 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
27010 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
27020 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
27030 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
27040 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
27050 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
27060 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
27070 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
27080 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
27090 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
270a0 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
270b0 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
270c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
270d0 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
270e0 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
270f0 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
27100 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
27110 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
27120 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
27130 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74  (v==0) )     ret
27140 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e  urn;  /* Existen
27150 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
27160 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
27170 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70    if( NEVER(pExp
27180 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  r==0) ) return; 
27190 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20   /* No way this 
271a0 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  can happen */.  
271b0 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
271c0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
271d0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
271e0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
271f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
27200 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
27210 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
27220 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
27230 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
27240 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
27250 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75  pr->pLeft, d2,ju
27260 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
27270 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
27280 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
27290 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
272a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
272b0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
272c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
272d0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
272e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
272f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
27300 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
27310 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
27320 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
27330 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
27340 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
27350 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27360 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
27370 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27380 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
27390 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
273a0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
273b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
273c0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
273d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
273e0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
273f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
27400 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
27410 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
27420 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
27430 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
27440 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
27450 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
27460 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
27470 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
27480 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27490 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
274a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
274b0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
274c0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
274d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
274e0 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20   TK_TRUTH: {.   
274f0 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20     int isNot;   
27500 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55     /* IS NOT TRU
27510 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c 53  E or IS NOT FALS
27520 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  E */.      int i
27530 73 54 72 75 65 3b 20 20 20 20 20 2f 2a 20 49 53  sTrue;     /* IS
27540 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20   TRUE or IS NOT 
27550 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65  TRUE */.      te
27560 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27570 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ll==0 );.      i
27580 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70  sNot = pExpr->op
27590 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20  2==TK_ISNOT;.   
275a0 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69     isTrue = sqli
275b0 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75  te3ExprTruthValu
275c0 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  e(pExpr->pRight)
275d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
275e0 28 20 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f  ( isTrue && isNo
275f0 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
27600 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20  ase( !isTrue && 
27610 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69  isNot );.      i
27620 66 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f  f( isTrue ^ isNo
27630 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
27640 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
27650 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27660 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20  eft, dest,.     
27670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27680 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c       isNot ? SQL
27690 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a  ITE_JUMPIFNULL :
276a0 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
276b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
276c0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
276d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
276e0 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20  t, dest,.       
276f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27700 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c 49      isNot ? SQLI
27710 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a 20  TE_JUMPIFNULL : 
27720 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
27730 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
27740 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
27750 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
27760 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
27770 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
27780 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
27790 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
277a0 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
277b0 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
277c0 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_NE;.      jum
277d0 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
277e0 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
277f0 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
27800 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
27810 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
27820 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
27830 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
27840 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
27850 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
27860 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
27870 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
27880 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
27890 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
278a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
278b0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
278c0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
278d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
278e0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
278f0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
27900 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
27910 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
27920 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
27930 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
27940 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
27950 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
27960 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
27970 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
27980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27990 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
279a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
279b0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
279c0 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
279d0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
279e0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
279f0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
27a00 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
27a10 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
27a20 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
27a30 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
27a40 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
27a50 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
27a60 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
27a70 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
27a80 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
27a90 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
27aa0 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
27ab0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
27ac0 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
27ad0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
27ae0 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
27af0 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
27b00 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
27b10 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
27b20 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27b30 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
27b40 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
27b50 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
27b60 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27b70 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
27b80 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
27b90 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
27ba0 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
27bb0 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
27bc0 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
27bd0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27be0 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
27bf0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
27c00 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
27c10 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27c20 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
27c30 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
27c40 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
27c50 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27c60 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
27c70 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
27c80 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
27c90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27ca0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
27cb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
27cc0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
27cd0 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
27ce0 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
27cf0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
27d00 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
27d10 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
27d20 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
27d30 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
27d40 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
27d50 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
27d60 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
27d70 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27d80 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
27d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27da0 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
27db0 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
27dc0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27dd0 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
27de0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
27df0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
27e00 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
27e10 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
27e20 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
27e30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27e40 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
27e50 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
27e60 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
27e70 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
27e80 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
27e90 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
27ea0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
27eb0 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
27ec0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27ed0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
27ee0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
27ef0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
27f00 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
27f10 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
27f20 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
27f30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
27f40 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
27f50 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
27f60 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
27f70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27f80 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
27f90 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
27fa0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
27fb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
27fc0 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
27fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
27fe0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
27ff0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
28000 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
28010 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
28020 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f  : {.    default_
28030 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20  expr:.      if( 
28040 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
28050 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
28060 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
28070 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
28080 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
28090 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
280a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
280b0 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  No-op */.      }
280c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
280d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
280e0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
280f0 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
28100 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28110 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
28120 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
28130 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
28140 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
28150 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
28160 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
28170 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
28180 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
28190 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
281a0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
281b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
281c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
281d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
281e0 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
281f0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
28200 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
28210 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
28220 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
28230 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
28240 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
28250 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
28260 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
28270 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
28280 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
28290 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
282a0 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
282b0 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
282c0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
282d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
282e0 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
282f0 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
28300 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
28310 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
28320 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
28330 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
28340 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
28350 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
28360 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
28370 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
28380 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
28390 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
283a0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
283b0 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
283c0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
283d0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
283e0 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
283f0 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
28400 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
28410 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
28420 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
28430 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
28440 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
28450 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
28460 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
28470 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65  eturn; /* Existe
28480 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
28490 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
284a0 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
284b0 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
284c0 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
284d0 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
284e0 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
284f0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
28500 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
28510 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
28520 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
28530 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
28540 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
28550 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
28560 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
28570 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
28580 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
28590 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
285a0 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
285b0 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
285c0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
285e0 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
285f0 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
28600 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
28610 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
28620 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
28630 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
28640 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
28650 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
28670 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
28680 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
28690 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
286a0 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
286b0 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
286c0 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
286d0 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
286e0 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
286f0 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
28700 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
28710 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
28720 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
28730 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
28740 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
28750 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
28760 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
28770 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
28780 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
28790 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
287a0 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
287b0 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
287c0 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
287d0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
287e0 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
287f0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28800 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
28810 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
28820 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28830 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
28840 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
28850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
28860 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
28870 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
28880 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
28890 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
288a0 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
288b0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
288c0 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
288d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
288e0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
288f0 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
28900 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28910 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
28920 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
28930 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
28940 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
28950 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
28960 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
28970 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
28980 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
28990 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
289a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
289b0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
289c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
289d0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
289e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
289f0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
28a00 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
28a10 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
28a20 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
28a30 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
28a40 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
28a50 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
28a60 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
28a70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
28a80 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
28a90 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
28aa0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
28ab0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
28ac0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
28ad0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
28ae0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
28af0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28b00 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70  >pLeft, d2, jump
28b10 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
28b20 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
28b30 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
28b40 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
28b50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28b60 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
28b70 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
28b80 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
28b90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
28ba0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
28bb0 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
28bc0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
28bd0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
28be0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
28bf0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
28c00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28c10 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
28c20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
28c30 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
28c40 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28c50 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
28c60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
28c70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
28c80 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20  K_TRUTH: {.     
28c90 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20 2f 2a   int isNot;   /*
28ca0 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72 20   IS NOT TRUE or 
28cb0 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a  IS NOT FALSE */.
28cc0 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65        int isTrue
28cd0 3b 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72  ;  /* IS TRUE or
28ce0 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a   IS NOT TRUE */.
28cf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28d00 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
28d10 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70  .      isNot = p
28d20 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53  Expr->op2==TK_IS
28d30 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75  NOT;.      isTru
28d40 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54  e = sqlite3ExprT
28d50 72 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d  ruthValue(pExpr-
28d60 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
28d70 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65  testcase( isTrue
28d80 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20   && isNot );.   
28d90 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
28da0 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b  True && isNot );
28db0 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72 75  .      if( isTru
28dc0 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20  e ^ isNot ){.   
28dd0 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20       /* IS TRUE 
28de0 61 6e 64 20 49 53 20 4e 4f 54 20 46 41 4c 53 45  and IS NOT FALSE
28df0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
28e00 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
28e10 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28e20 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20  eft, dest,.     
28e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e40 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30 20        isNot ? 0 
28e50 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  : SQLITE_JUMPIFN
28e60 55 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 7d 65 6c  ULL);..      }el
28e70 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
28e80 53 20 46 41 4c 53 45 20 61 6e 64 20 49 53 20 4e  S FALSE and IS N
28e90 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20  OT TRUE */.     
28ea0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
28eb0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
28ec0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
28ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28ee0 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
28ef0 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55   ? 0 : SQLITE_JU
28f00 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
28f10 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
28f20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
28f30 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
28f40 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
28f50 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
28f60 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
28f70 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
28f80 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
28f90 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
28fa0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
28fb0 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
28fc0 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  Q;.      jumpIfN
28fd0 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
28fe0 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
28ff0 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
29000 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
29010 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
29020 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
29030 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
29040 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
29050 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
29060 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
29070 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
29080 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
29090 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
290a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
290b0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
290c0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
290d0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
290e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
290f0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
29100 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
29110 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
29120 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
29130 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
29140 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
29150 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
29160 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
29170 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
29190 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
291a0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
291b0 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
291c0 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
291d0 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
291e0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
291f0 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
29200 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
29210 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
29220 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
29230 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
29240 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
29250 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
29260 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
29270 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
29280 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
29290 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
292a0 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
292b0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
292c0 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
292d0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
292e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
292f0 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
29300 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
29310 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
29320 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
29330 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
29340 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
29350 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
29360 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
29370 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
29380 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
29390 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
293a0 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
293b0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
293c0 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
293d0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
293e0 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
293f0 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
29400 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
29410 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
29420 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
29430 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
29440 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
29450 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
29460 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
29470 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
29480 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
29490 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
294a0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
294b0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
294c0 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
294d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
294e0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
294f0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
29500 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
29510 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
29520 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
29530 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
29540 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20  p==TK_ISNULL ); 
29550 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
29560 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
29570 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
29580 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
29590 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LL );  VdbeCover
295a0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
295b0 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
295c0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
295d0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
295e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
295f0 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
29600 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
29610 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
29620 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
29630 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
29640 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
29650 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
29660 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
29670 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29680 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
29690 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
296a0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
296b0 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
296c0 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
296d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
296e0 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
296f0 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
29700 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29710 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
29720 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
29730 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
29740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
29750 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
29760 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
29770 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
29780 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
29790 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
297a0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
297b0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
297c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
297d0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
297e0 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20  default_expr: . 
297f0 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
29800 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
29810 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
29820 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
29830 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
29840 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
29850 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
29860 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
29870 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
29880 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
29890 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
298a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
298b0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
298c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
298d0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
298e0 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
298f0 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
29900 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
29910 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
29920 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
29930 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
29940 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
29950 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
29960 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
29970 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
29980 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
29990 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
299a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
299b0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
299c0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
299d0 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
299e0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29  te3ExprIfFalse()
299f0 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63   except that a c
29a00 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70  opy is made of p
29a10 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63  Expr before.** c
29a20 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20  ode generation, 
29a30 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73  and that copy is
29a40 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63   deleted after c
29a50 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ode generation. 
29a60 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20  This.** ensures 
29a70 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
29a80 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61  l pExpr is uncha
29a90 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
29aa0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
29ab0 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Dup(Parse *pPars
29ac0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
29ad0 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d  int dest,int jum
29ae0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69  pIfNull){.  sqli
29af0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
29b00 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43  ->db;.  Expr *pC
29b10 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
29b20 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
29b30 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
29b40 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
29b50 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
29b60 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
29b70 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d  pCopy, dest, jum
29b80 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
29b90 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
29ba0 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a  e(db, pCopy);.}.
29bb0 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f  ./*.** Expressio
29bc0 6e 20 70 56 61 72 20 69 73 20 67 75 61 72 61 6e  n pVar is guaran
29bd0 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 53 51  teed to be an SQ
29be0 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45 78 70  L variable. pExp
29bf0 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a 2a 20  r may be any.** 
29c00 74 79 70 65 20 6f 66 20 65 78 70 72 65 73 73 69  type of expressi
29c10 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  on..**.** If pEx
29c20 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53  pr is a simple S
29c30 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20 69 6e  QL value - an in
29c40 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74 72  teger, real, str
29c50 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20  ing, blob.** or 
29c60 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74 68 65  NULL value - the
29c70 6e 20 74 68 65 20 56 44 42 45 20 63 75 72 72 65  n the VDBE curre
29c80 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65 70 61  ntly being prepa
29c90 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75 72 65  red is configure
29ca0 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65 70 61  d.** to re-prepa
29cb0 72 65 20 65 61 63 68 20 74 69 6d 65 20 61 20 6e  re each time a n
29cc0 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f 75 6e  ew value is boun
29cd0 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56  d to variable pV
29ce0 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69  ar..**.** Additi
29cf0 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78 70 72  onally, if pExpr
29d00 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c   is a simple SQL
29d10 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 76   value and the v
29d20 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20 73  alue is the.** s
29d30 61 6d 65 20 61 73 20 74 68 61 74 20 63 75 72 72  ame as that curr
29d40 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f 20 76  ently bound to v
29d50 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20 6e 6f  ariable pVar, no
29d60 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
29d70 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ed..** Otherwise
29d80 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 73 20  , if the values 
29d90 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d 65  are not the same
29da0 20 6f 72 20 69 66 20 70 45 78 70 72 20 69 73 20   or if pExpr is 
29db0 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  not a simple.** 
29dc0 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72 6f 20  SQL value, zero 
29dd0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
29de0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
29df0 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 50  ompareVariable(P
29e00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
29e10 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72 20 2a  pr *pVar, Expr *
29e20 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65  pExpr){.  int re
29e30 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  s = 0;.  int iVa
29e40 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  r;.  sqlite3_val
29e50 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20 30 3b  ue *pL, *pR = 0;
29e60 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  .  .  sqlite3Val
29e70 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
29e80 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51  e->db, pExpr, SQ
29e90 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
29ea0 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70 52 29  E_AFF_BLOB, &pR)
29eb0 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a 20 20  ;.  if( pR ){.  
29ec0 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d 3e 69    iVar = pVar->i
29ed0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
29ee0 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
29ef0 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  k(pParse->pVdbe,
29f00 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c 20 3d   iVar);.    pL =
29f10 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42   sqlite3VdbeGetB
29f20 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72 73 65  oundValue(pParse
29f30 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69 56  ->pReprepare, iV
29f40 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  ar, SQLITE_AFF_B
29f50 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  LOB);.    if( pL
29f60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
29f70 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
29f80 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58  (pL)==SQLITE_TEX
29f90 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
29fa0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
29fb0 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  pL); /* Make sur
29fc0 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69  e the encoding i
29fd0 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20  s UTF-8 */.     
29fe0 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20 20   }.      res =  
29ff0 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  0==sqlite3MemCom
2a000 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30 29 3b  pare(pL, pR, 0);
2a010 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2a020 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 29 3b  e3ValueFree(pR);
2a030 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
2a040 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a  eFree(pL);.  }..
2a050 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
2a060 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
2a070 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
2a080 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
2a090 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ees.  Return 0 i
2a0a0 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
2a0b0 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d  ressions are com
2a0c0 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61  pletely identica
2a0d0 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  l.  Return 1 if 
2a0e0 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79  they differ only
2a0f0 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  .** by a COLLATE
2a100 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65   operator at the
2a110 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74   top level.  Ret
2a120 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61  urn 2 if there a
2a130 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a  re differences.*
2a140 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  * other than the
2a150 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41   top-level COLLA
2a160 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  TE operator..**.
2a170 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
2a180 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
2a190 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
2a1a0 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
2a1b0 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
2a1c0 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
2a1d0 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
2a1e0 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
2a1f0 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
2a200 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65  *.** The pA side
2a210 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20   might be using 
2a220 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66  TK_REGISTER.  If
2a230 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
2a240 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e  e and pB is.** n
2a250 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  ot using TK_REGI
2a260 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68 65  STER but is othe
2a270 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74  rwise equivalent
2a280 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74  , then still ret
2a290 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  urn 0..**.** Som
2a2a0 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
2a2b0 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
2a2c0 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  2 even if the tw
2a2d0 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
2a2e0 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
2a2f0 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
2a300 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
2a310 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
2a320 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
2a330 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a  l, we return 2 j
2a340 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
2a350 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
2a360 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32  ine.** returns 2
2a370 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
2a380 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
2a390 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
2a3a0 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
2a3b0 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
2a3c0 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
2a3d0 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72  t a 0 or 1 retur
2a3e0 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
2a3f0 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
2a400 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
2a410 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
2a420 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
2a430 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2a440 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
2a450 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
2a460 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74  n extra 2 - that
2a470 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
2a480 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
2a490 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
2a4a0 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
2a4b0 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
2a4c0 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20  ct 0 or 1 could 
2a4d0 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
2a4e0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
2a4f0 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55  pParse is not NU
2a500 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52 49 41  LL then TK_VARIA
2a510 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70 41 20  BLE terms in pA 
2a520 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20 69 6e  with bindings in
2a530 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52 65 70  .** pParse->pRep
2a540 72 65 70 61 72 65 20 63 61 6e 20 62 65 20 6d 61  repare can be ma
2a550 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 6c 69  tched against li
2a560 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20 20 54  terals in pB.  T
2a570 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70  he .** pParse->p
2a580 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 62 69  Vdbe->expmask bi
2a590 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74 65 64  tmask is updated
2a5a0 20 66 6f 72 20 65 61 63 68 20 76 61 72 69 61 62   for each variab
2a5b0 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a  le referenced..*
2a5c0 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 4e  * If pParse is N
2a5d0 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61 6c 20  ULL (the normal 
2a5e0 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79 20 54  case) then any T
2a5f0 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d 20  K_VARIABLE term 
2a600 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  in .** Argument 
2a610 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20 6e 6f  pParse should no
2a620 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e 20  rmally be NULL. 
2a630 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
2a640 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a 20 70  L and pA or.** p
2a650 42 20 63 61 75 73 65 73 20 61 20 72 65 74 75 72  B causes a retur
2a660 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f  n value of 2..*/
2a670 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2a680 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70  Compare(Parse *p
2a690 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 41 2c  Parse, Expr *pA,
2a6a0 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69   Expr *pB, int i
2a6b0 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62  Tab){.  u32 comb
2a6c0 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28  inedFlags;.  if(
2a6d0 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
2a6e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
2a6f0 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20  ==pA ? 0 : 2;.  
2a700 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 20 26  }.  if( pParse &
2a710 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  & pA->op==TK_VAR
2a720 49 41 42 4c 45 20 26 26 20 65 78 70 72 43 6f 6d  IABLE && exprCom
2a730 70 61 72 65 56 61 72 69 61 62 6c 65 28 70 50 61  pareVariable(pPa
2a740 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29 7b 0a  rse, pA, pB) ){.
2a750 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2a760 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  }.  combinedFlag
2a770 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20  s = pA->flags | 
2a780 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28  pB->flags;.  if(
2a790 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
2a7a0 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
2a7b0 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61      if( (pA->fla
2a7c0 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f  gs&pB->flags&EP_
2a7d0 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20  IntValue)!=0 && 
2a7e0 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42  pA->u.iValue==pB
2a7f0 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20  ->u.iValue ){.  
2a800 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2a810 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
2a820 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
2a830 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20  op!=pB->op ){.  
2a840 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
2a850 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
2a860 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a870 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
2a880 2c 70 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20  ,pB,iTab)<2 ){. 
2a890 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2a8a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d     }.    if( pB-
2a8b0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
2a8c0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
2a8d0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41  mpare(pParse, pA
2a8e0 2c 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29  ,pB->pLeft,iTab)
2a8f0 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
2a900 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2a910 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
2a920 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
2a930 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21  OLUMN && pA->op!
2a940 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26  =TK_AGG_COLUMN &
2a950 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  & pA->u.zToken )
2a960 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
2a970 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  ==TK_FUNCTION ){
2a980 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2a990 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e  e3StrICmp(pA->u.
2a9a0 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
2a9b0 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ken)!=0 ) return
2a9c0 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
2a9d0 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pA->op==TK_COL
2a9e0 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66  LATE ){.      if
2a9f0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
2aa00 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
2aa10 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
2aa20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2aa30 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
2aa40 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42  (pA->u.zToken,pB
2aa50 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29  ->u.zToken)!=0 )
2aa60 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  {.      return 2
2aa70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2aa80 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
2aa90 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
2aaa0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
2aab0 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
2aac0 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  2;.  if( ALWAYS(
2aad0 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
2aae0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d   EP_TokenOnly)==
2aaf0 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  0) ){.    if( co
2ab00 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
2ab10 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74  _xIsSelect ) ret
2ab20 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
2ab30 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2ab40 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c  e(pParse, pA->pL
2ab50 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20  eft, pB->pLeft, 
2ab60 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
2ab70 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2ab80 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
2ab90 72 73 65 2c 20 70 41 2d 3e 70 52 69 67 68 74 2c  rse, pA->pRight,
2aba0 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pB->pRight, iTa
2abb0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
2abc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2abd0 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41  prListCompare(pA
2abe0 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78  ->x.pList, pB->x
2abf0 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20  .pList, iTab) ) 
2ac00 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 61 73  return 2;.    as
2ac10 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 46  sert( (combinedF
2ac20 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65  lags & EP_Reduce
2ac30 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  d)==0 );.    if(
2ac40 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49   pA->op!=TK_STRI
2ac50 4e 47 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  NG && pA->op!=TK
2ac60 5f 54 52 55 45 46 41 4c 53 45 20 29 7b 0a 20 20  _TRUEFALSE ){.  
2ac70 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c      if( pA->iCol
2ac80 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
2ac90 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
2aca0 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c     if( pA->iTabl
2acb0 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20  e!=pB->iTable . 
2acc0 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54        && (pA->iT
2acd0 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45  able!=iTab || NE
2ace0 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d  VER(pB->iTable>=
2acf0 30 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  0)) ) return 2;.
2ad00 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
2ad10 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
2ad20 46 55 4e 43 0a 20 20 20 20 2f 2a 20 4a 75 73 74  FUNC.    /* Just
2ad30 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 74 68  ification for th
2ad40 65 20 61 73 73 65 72 74 28 29 3a 0a 20 20 20 20  e assert():.    
2ad50 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ** window functi
2ad60 6f 6e 73 20 68 61 76 65 20 70 2d 3e 6f 70 3d 3d  ons have p->op==
2ad70 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 62 75 74 20  TK_FUNCTION but 
2ad80 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2ad90 6f 6e 73 0a 20 20 20 20 2a 2a 20 68 61 76 65 20  ons.    ** have 
2ada0 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  p->op==TK_AGG_FU
2adb0 4e 43 54 49 4f 4e 2e 20 20 53 6f 20 61 6e 79 20  NCTION.  So any 
2adc0 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65  comparison betwe
2add0 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65 0a  en an aggregate.
2ade0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
2adf0 61 6e 64 20 61 20 77 69 6e 64 6f 77 20 66 75 6e  and a window fun
2ae00 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 68 61 76  ction should hav
2ae10 65 20 66 61 69 6c 65 64 20 62 65 66 6f 72 65 20  e failed before 
2ae20 72 65 61 63 68 69 6e 67 0a 20 20 20 20 2a 2a 20  reaching.    ** 
2ae30 74 68 69 73 20 70 6f 69 6e 74 2e 20 20 41 6e 64  this point.  And
2ae40 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
2ae50 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 77  ible to have a w
2ae60 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61  indow function a
2ae70 6e 64 0a 20 20 20 20 2a 2a 20 61 20 73 63 61 6c  nd.    ** a scal
2ae80 61 72 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ar function with
2ae90 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
2aea0 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  nd number of arg
2aeb0 75 6d 65 6e 74 73 2e 20 20 53 6f 0a 20 20 20 20  uments.  So.    
2aec0 2a 2a 20 69 66 20 77 65 20 72 65 61 63 68 20 74  ** if we reach t
2aed0 68 69 73 20 70 6f 69 6e 74 2c 20 65 69 74 68 65  his point, eithe
2aee0 72 20 41 20 61 6e 64 20 42 20 62 6f 74 68 20 77  r A and B both w
2aef0 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
2af00 6f 72 0a 20 20 20 20 2a 2a 20 6e 65 69 74 68 65  or.    ** neithe
2af10 72 20 61 72 65 20 61 20 77 69 6e 64 6f 77 20 66  r are a window f
2af20 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20  unctions. */.   
2af30 20 61 73 73 65 72 74 28 20 28 70 41 2d 3e 70 57   assert( (pA->pW
2af40 69 6e 3d 3d 30 29 3d 3d 28 70 42 2d 3e 70 57 69  in==0)==(pB->pWi
2af50 6e 3d 3d 30 29 20 29 3b 0a 0a 20 20 20 20 69 66  n==0) );..    if
2af60 28 20 70 41 2d 3e 70 57 69 6e 21 3d 30 20 29 7b  ( pA->pWin!=0 ){
2af70 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2af80 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28  e3WindowCompare(
2af90 70 50 61 72 73 65 2c 70 41 2d 3e 70 57 69 6e 2c  pParse,pA->pWin,
2afa0 70 42 2d 3e 70 57 69 6e 29 21 3d 30 20 29 20 72  pB->pWin)!=0 ) r
2afb0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 23  eturn 2;.    }.#
2afc0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
2afd0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
2afe0 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c  ompare two ExprL
2aff0 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65  ist objects.  Re
2b000 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61  turn 0 if they a
2b010 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64  re identical and
2b020 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   .** non-zero if
2b030 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20   they differ in 
2b040 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  any way..**.** I
2b050 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
2b060 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
2b070 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
2b080 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
2b090 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
2b0a0 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
2b0b0 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
2b0c0 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
2b0d0 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
2b0e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
2b0f0 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ght return non-z
2b100 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65  ero for equivale
2b110 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54  nt ExprLists.  T
2b120 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65  he.** only conse
2b130 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64  quence will be d
2b140 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61  isabled optimiza
2b150 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73  tions.  But this
2b160 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74   routine.** must
2b170 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20   never return 0 
2b180 69 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c  if the two ExprL
2b190 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ist objects are 
2b1a0 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a  different, or.**
2b1b0 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77   a malfunction w
2b1c0 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  ill result..**.*
2b1d0 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74  * Two NULL point
2b1e0 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ers are consider
2b1f0 65 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d  ed to be the sam
2b200 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70  e.  But a NULL p
2b210 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73  ointer.** always
2b220 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20   differs from a 
2b230 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  non-NULL pointer
2b240 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2b250 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
2b260 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78  ExprList *pA, Ex
2b270 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20  prList *pB, int 
2b280 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iTab){.  int i;.
2b290 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70    if( pA==0 && p
2b2a0 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  B==0 ) return 0;
2b2b0 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
2b2c0 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  pB==0 ) return 1
2b2d0 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70  ;.  if( pA->nExp
2b2e0 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72  r!=pB->nExpr ) r
2b2f0 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69  eturn 1;.  for(i
2b300 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b  =0; i<pA->nExpr;
2b310 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
2b320 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b  *pExprA = pA->a[
2b330 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78  i].pExpr;.    Ex
2b340 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d  pr *pExprB = pB-
2b350 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
2b360 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f   if( pA->a[i].so
2b370 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69  rtOrder!=pB->a[i
2b380 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65  ].sortOrder ) re
2b390 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
2b3a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2b3b0 72 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45  re(0, pExprA, pE
2b3c0 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65  xprB, iTab) ) re
2b3d0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2b3e0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2b3f0 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   Like sqlite3Exp
2b400 72 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70  rCompare() excep
2b410 74 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  t COLLATE operat
2b420 6f 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c  ors at the top-l
2b430 65 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f  evel.** are igno
2b440 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
2b450 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b  te3ExprCompareSk
2b460 69 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  ip(Expr *pA, Exp
2b470 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  r *pB, int iTab)
2b480 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2b490 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
2b4a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
2b4b0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
2b4c0 6c 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20  late(pA),.      
2b4d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2b4e0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42  prSkipCollate(pB
2b4f0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2b500 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iTab);.}../*.** 
2b510 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77  Return true if w
2b520 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20  e can prove the 
2b530 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  pE2 will always 
2b540 62 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69  be true if pE1 i
2b550 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75  s.** true.  Retu
2b560 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63  rn false if we c
2b570 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74  annot complete t
2b580 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70  he proof or if p
2b590 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66  E2 might.** be f
2b5a0 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a  alse.  Examples:
2b5b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  .**.**     pE1: 
2b5c0 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20  x==5       pE2: 
2b5d0 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
2b5e0 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
2b5f0 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20       pE1: x>0   
2b600 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
2b610 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
2b620 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
2b630 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20  pE1: x=21       
2b640 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34  pE2: x=21 OR y=4
2b650 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  3     Result: tr
2b660 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
2b670 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78  !=123     pE2: x
2b680 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
2b690 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2b6a0 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20      pE1: x!=?1  
2b6b0 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
2b6c0 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
2b6d0 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
2b6e0 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45  1: x IS NULL  pE
2b6f0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2b700 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73      Result: fals
2b710 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
2b720 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20  IS ?2    pE2: x 
2b730 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2b740 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a  euslt: false.**.
2b750 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e  ** When comparin
2b760 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  g TK_COLUMN node
2b770 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e  s between pE1 an
2b780 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61  d pE2, if pE2 ha
2b790 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65  s.** Expr.iTable
2b7a0 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61  <0 then assume a
2b7b0 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69   table number gi
2b7c0 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a  ven by iTab..**.
2b7d0 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
2b7e0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
2b7f0 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75  he values of bou
2b800 6e 64 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  nd variables in 
2b810 70 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 70  pE1 are .** comp
2b820 61 72 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74  ared against lit
2b830 65 72 61 6c 20 76 61 6c 75 65 73 20 69 6e 20 70  eral values in p
2b840 45 32 20 61 6e 64 20 70 50 61 72 73 65 2d 3e 70  E2 and pParse->p
2b850 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69 73  Vdbe->expmask is
2b860 0a 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20  .** modified to 
2b870 72 65 63 6f 72 64 20 77 68 69 63 68 20 62 6f 75  record which bou
2b880 6e 64 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  nd variables are
2b890 20 72 65 66 65 72 65 6e 63 65 64 2e 20 20 49 66   referenced.  If
2b8a0 20 70 50 61 72 73 65 20 0a 2a 2a 20 69 73 20 4e   pParse .** is N
2b8b0 55 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65 20  ULL, then false 
2b8c0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
2b8d0 20 69 66 20 70 45 31 20 63 6f 6e 74 61 69 6e 73   if pE1 contains
2b8e0 20 61 6e 79 20 62 6f 75 6e 64 20 76 61 72 69 61   any bound varia
2b8f0 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  bles..**.** When
2b900 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72   in doubt, retur
2b910 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e  n false.  Return
2b920 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67  ing true might g
2b930 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
2b940 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74  e.** improvement
2b950 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c  .  Returning fal
2b960 73 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61  se might cause a
2b970 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
2b980 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69  uction, but.** i
2b990 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69  t will always gi
2b9a0 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  ve the correct a
2b9b0 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e  nswer and is hen
2b9c0 63 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a  ce always safe..
2b9d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2b9e0 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61  prImpliesExpr(Pa
2b9f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2ba00 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45  r *pE1, Expr *pE
2ba10 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  2, int iTab){.  
2ba20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2ba30 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2ba40 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d  E1, pE2, iTab)==
2ba50 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2ba60 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32  1;.  }.  if( pE2
2ba70 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26  ->op==TK_OR.   &
2ba80 26 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d  & (sqlite3ExprIm
2ba90 70 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65  pliesExpr(pParse
2baa0 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66  , pE1, pE2->pLef
2bab0 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20  t, iTab).       
2bac0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2bad0 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
2bae0 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
2baf0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
2bb00 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2bb10 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
2bb20 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  E2->op==TK_NOTNU
2bb30 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54  LL && pE1->op!=T
2bb40 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d  K_ISNULL && pE1-
2bb50 3e 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20  >op!=TK_IS ){.  
2bb60 20 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c    Expr *pX = sql
2bb70 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2bb80 61 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b  ate(pE1->pLeft);
2bb90 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
2bba0 58 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b  X!=pE1->pLeft );
2bbb0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2bbc0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2bbd0 73 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65  se, pX, pE2->pLe
2bbe0 66 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72  ft, iTab)==0 ) r
2bbf0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
2bc00 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2bc10 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 45 78  * This is the Ex
2bc20 70 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b  pr node callback
2bc30 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72   for sqlite3Expr
2bc40 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f  ImpliesNotNullRo
2bc50 77 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65  w()..** If the e
2bc60 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72  xpression node r
2bc70 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65  equires that the
2bc80 20 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65   table at pWalke
2bc90 72 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20  r->iCur.** have 
2bca0 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 63 6f 6c 75 6d  a non-NULL colum
2bcb0 6e 2c 20 74 68 65 6e 20 73 65 74 20 70 57 61 6c  n, then set pWal
2bcc0 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20  ker->eCode to 1 
2bcd0 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2f 0a 73 74  and abort..*/.st
2bce0 61 74 69 63 20 69 6e 74 20 69 6d 70 6c 69 65 73  atic int implies
2bcf0 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b 65  NotNullRow(Walke
2bd00 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2bd10 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54   *pExpr){.  /* T
2bd20 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
2bd30 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 57  nly called for W
2bd40 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
2bd50 65 73 73 69 6f 6e 73 20 61 6e 64 20 73 6f 20 69  essions and so i
2bd60 74 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 68 61  t.  ** cannot ha
2bd70 76 65 20 61 6e 79 20 54 4b 5f 41 47 47 5f 43 4f  ve any TK_AGG_CO
2bd80 4c 55 4d 4e 20 65 6e 74 72 69 65 73 20 62 65 63  LUMN entries bec
2bd90 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 6f  ause those are o
2bda0 6e 6c 79 20 66 6f 75 6e 64 0a 20 20 2a 2a 20 69  nly found.  ** i
2bdb0 6e 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73  n HAVING clauses
2bdc0 2e 20 20 57 65 20 63 61 6e 20 67 65 74 20 61 20  .  We can get a 
2bdd0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
2bde0 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  in a WHERE claus
2bdf0 65 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68 61 74  e,.  ** but that
2be00 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 20 63   is an illegal c
2be10 6f 6e 73 74 72 75 63 74 20 61 6e 64 20 74 68 65  onstruct and the
2be20 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 72   query will be r
2be30 65 6a 65 63 74 65 64 20 61 74 0a 20 20 2a 2a 20  ejected at.  ** 
2be40 61 20 6c 61 74 65 72 20 73 74 61 67 65 20 6f 66  a later stage of
2be50 20 70 72 6f 63 65 73 73 69 6e 67 2c 20 73 6f 20   processing, so 
2be60 74 68 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  the TK_AGG_FUNCT
2be70 49 4f 4e 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  ION case does no
2be80 74 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62  t.  ** need to b
2be90 65 20 63 6f 6e 73 69 64 65 72 65 64 20 68 65 72  e considered her
2bea0 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
2beb0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
2bec0 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 74 65  G_COLUMN );.  te
2bed0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2bee0 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
2bef0 4f 4e 20 29 3b 0a 0a 20 20 69 66 28 20 45 78 70  ON );..  if( Exp
2bf00 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2bf10 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
2bf20 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72   ) return WRC_Pr
2bf30 75 6e 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70  une;.  switch( p
2bf40 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
2bf50 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
2bf60 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a     case TK_NOT:.
2bf70 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
2bf80 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
2bf90 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
2bfa0 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
2bfb0 43 41 53 45 3a 0a 20 20 20 20 63 61 73 65 20 54  CASE:.    case T
2bfc0 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IN:.    case T
2bfd0 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
2bfe0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2bff0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
2c000 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2c010 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2c020 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65  _NOT );.      te
2c030 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c040 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
2c050 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c060 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
2c070 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c080 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c090 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65  K_OR );.      te
2c0a0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c0b0 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20 20  p==TK_CASE );.  
2c0c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c0d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29  xpr->op==TK_IN )
2c0e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2c0f0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c100 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
2c110 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2c120 6e 65 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ne;.    case TK_
2c130 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 69 66  COLUMN:.      if
2c140 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75  ( pWalker->u.iCu
2c150 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r==pExpr->iTable
2c160 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c   ){.        pWal
2c170 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
2c180 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2c190 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
2c1a0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
2c1b0 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20 2f  RC_Prune;..    /
2c1c0 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 73  * Virtual tables
2c1d0 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
2c1e0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
2c1f0 6c 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20 53 6f  like x=NULL.  So
2c200 0a 20 20 20 20 2a 2a 20 61 20 74 65 72 6d 20 6f  .    ** a term o
2c210 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 79 20 64  f the form x=y d
2c220 6f 65 73 20 6e 6f 74 20 70 72 6f 76 65 20 74 68  oes not prove th
2c230 61 74 20 79 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  at y is not null
2c240 20 69 66 20 78 0a 20 20 20 20 2a 2a 20 69 73 20   if x.    ** is 
2c250 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  the column of a 
2c260 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
2c270 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
2c280 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
2c290 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
2c2a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
2c2b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
2c2c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
2c2d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2c2e0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
2c2f0 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
2c300 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2c310 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_NE );.      t
2c320 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2c330 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
2c340 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2c350 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b  pr->op==TK_LE );
2c360 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2c370 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
2c380 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
2c390 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2c3a0 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 69  TK_GE );.      i
2c3b0 66 28 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  f( (pExpr->pLeft
2c3c0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2c3d0 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 45 78  && IsVirtual(pEx
2c3e0 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 54 61 62 29  pr->pLeft->pTab)
2c3f0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78  ).       || (pEx
2c400 70 72 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pr->pRight->op==
2c410 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56  TK_COLUMN && IsV
2c420 69 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 52  irtual(pExpr->pR
2c430 69 67 68 74 2d 3e 70 54 61 62 29 29 0a 20 20 20  ight->pTab)).   
2c440 20 20 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74     ){.       ret
2c450 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2c460 20 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75       }.    defau
2c470 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
2c480 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
2c490 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
2c4a0 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72  rn true (non-zer
2c4b0 6f 29 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e  o) if expression
2c4c0 20 70 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 74   p can only be t
2c4d0 72 75 65 20 69 66 20 61 74 20 6c 65 61 73 74 0a  rue if at least.
2c4e0 2a 2a 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ** one column of
2c4f0 20 74 61 62 6c 65 20 69 54 61 62 20 69 73 20 6e   table iTab is n
2c500 6f 6e 2d 6e 75 6c 6c 2e 20 20 49 6e 20 6f 74 68  on-null.  In oth
2c510 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
2c520 20 74 72 75 65 0a 2a 2a 20 69 66 20 65 78 70 72   true.** if expr
2c530 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 61 6c  ession p will al
2c540 77 61 79 73 20 62 65 20 4e 55 4c 4c 20 6f 72 20  ways be NULL or 
2c550 66 61 6c 73 65 20 69 66 20 65 76 65 72 79 20 63  false if every c
2c560 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a  olumn of iTab.**
2c570 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
2c580 46 61 6c 73 65 20 6e 65 67 61 74 69 76 65 73 20  False negatives 
2c590 61 72 65 20 61 63 63 65 70 74 61 62 6c 65 2e 20  are acceptable. 
2c5a0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2c5b0 20 69 74 20 69 73 20 6f 6b 20 74 6f 20 72 65 74   it is ok to ret
2c5c0 75 72 6e 0a 2a 2a 20 7a 65 72 6f 20 65 76 65 6e  urn.** zero even
2c5d0 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   if expression p
2c5e0 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74   will never be t
2c5f0 72 75 65 20 6f 66 20 65 76 65 72 79 20 63 6f 6c  rue of every col
2c600 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69  umn of iTab.** i
2c610 73 20 4e 55 4c 4c 2e 20 20 41 20 66 61 6c 73 65  s NULL.  A false
2c620 20 6e 65 67 61 74 69 76 65 20 69 73 20 6d 65 72   negative is mer
2c630 65 6c 79 20 61 20 6d 69 73 73 65 64 20 6f 70 74  ely a missed opt
2c640 69 6d 69 7a 61 74 69 6f 6e 20 6f 70 70 6f 72 74  imization opport
2c650 75 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c  unity..**.** Fal
2c660 73 65 20 70 6f 73 69 74 69 76 65 73 20 61 72 65  se positives are
2c670 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2c 20 68 6f   not allowed, ho
2c680 77 65 76 65 72 2e 20 20 41 20 66 61 6c 73 65 20  wever.  A false 
2c690 70 6f 73 69 74 69 76 65 20 6d 61 79 20 72 65 73  positive may res
2c6a0 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 63  ult.** in an inc
2c6b0 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 0a 2a  orrect answer..*
2c6c0 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 70 20  *.** Terms of p 
2c6d0 74 68 61 74 20 61 72 65 20 6d 61 72 6b 65 64 20  that are marked 
2c6e0 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  with EP_FromJoin
2c6f0 20 28 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74   (and hence that
2c700 20 63 6f 6d 65 20 66 72 6f 6d 0a 2a 2a 20 74 68   come from.** th
2c710 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2c720 61 75 73 65 73 20 6f 66 20 4c 45 46 54 20 4a 4f  auses of LEFT JO
2c730 49 4e 53 29 20 61 72 65 20 65 78 63 6c 75 64 65  INS) are exclude
2c740 64 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79  d from the analy
2c750 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  sis..**.** This 
2c760 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
2c770 74 6f 20 63 68 65 63 6b 20 69 66 20 61 20 4c 45  to check if a LE
2c780 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 63  FT JOIN can be c
2c790 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 2a 2a  onverted into.**
2c7a0 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49   an ordinary JOI
2c7b0 4e 2e 20 20 54 68 65 20 70 20 61 72 67 75 6d 65  N.  The p argume
2c7c0 6e 74 20 69 73 20 74 68 65 20 57 48 45 52 45 20  nt is the WHERE 
2c7d0 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
2c7e0 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20  WHERE.** clause 
2c7f0 72 65 71 75 69 72 65 73 20 74 68 61 74 20 73 6f  requires that so
2c800 6d 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  me column of the
2c810 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
2c820 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a  the LEFT JOIN.**
2c830 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   be non-NULL, th
2c840 65 6e 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e  en the LEFT JOIN
2c850 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63   can be safely c
2c860 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  onverted into an
2c870 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 6a 6f 69  .** ordinary joi
2c880 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
2c890 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e  3ExprImpliesNonN
2c8a0 75 6c 6c 52 6f 77 28 45 78 70 72 20 2a 70 2c 20  ullRow(Expr *p, 
2c8b0 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 57 61 6c  int iTab){.  Wal
2c8c0 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
2c8d0 43 61 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69  Callback = impli
2c8e0 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20  esNotNullRow;.  
2c8f0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2c900 6b 20 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65  k = 0;.  w.xSele
2c910 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b  ctCallback2 = 0;
2c920 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a  .  w.eCode = 0;.
2c930 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 54 61    w.u.iCur = iTa
2c940 62 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  b;.  sqlite3Walk
2c950 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
2c960 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
2c970 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
2c980 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2c990 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
2c9a0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
2c9b0 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
2c9c0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  determine if an 
2c9d0 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
2c9e0 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72  e evaluated by r
2c9f0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
2ca00 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77  ** index only, w
2ca10 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
2ca20 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
2ca30 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2ca40 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72  ng.** table entr
2ca50 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72  y.  The IdxCover
2ca60 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74  .pIdx field is t
2ca70 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f  he index.  IdxCo
2ca80 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74  ver.iCur.** is t
2ca90 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  he cursor for th
2caa0 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  e table..*/.stru
2cab0 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20  ct IdxCover {.  
2cac0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
2cad0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
2cae0 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63   be tested for c
2caf0 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74  overage */.  int
2cb00 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a   iCur;        /*
2cb10 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
2cb20 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72  or the table cor
2cb30 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
2cb40 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f  e index */.};../
2cb50 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
2cb60 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72  e if there are r
2cb70 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2cb80 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a  umns in table .*
2cb90 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
2cba0 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e  xCover->iCur can
2cbb0 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73   be satisfied us
2cbc0 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ing the index.**
2cbd0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
2cbe0 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a  Cover->pIdx..*/.
2cbf0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
2cc00 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a  dxCover(Walker *
2cc10 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2cc20 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
2cc30 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
2cc40 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  N.   && pExpr->i
2cc50 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
2cc60 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
2cc70 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43  r.   && sqlite3C
2cc80 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61  olumnOfIndex(pWa
2cc90 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2cca0 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e  r->pIdx, pExpr->
2ccb0 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a  iColumn)<0.  ){.
2ccc0 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
2ccd0 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  de = 1;.    retu
2cce0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2ccf0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2cd00 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2cd10 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
2cd20 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20  n index pIdx on 
2cd30 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
2cd40 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  r iCur contains 
2cd50 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72  will.** the expr
2cd60 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
2cd70 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2cd80 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76  e index does cov
2cd90 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  er the.** expres
2cda0 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69  sion and false i
2cdb0 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  f the pExpr expr
2cdc0 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  ession reference
2cdd0 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a  s table columns.
2cde0 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
2cdf0 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64  found in the ind
2ce00 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41  ex pIdx..**.** A
2ce10 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67  n index covering
2ce20 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
2ce30 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78  eans that the ex
2ce40 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a  pression can be.
2ce50 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69  ** evaluated usi
2ce60 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65  ng only the inde
2ce70 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61  x and without ha
2ce80 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74  ving to lookup t
2ce90 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
2cea0 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  ing table entry.
2ceb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2cec0 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65  xprCoveredByInde
2ced0 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  x(.  Expr *pExpr
2cee0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2cef0 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
2cf00 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
2cf10 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2cf20 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
2cf30 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
2cf40 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  onding table */.
2cf50 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
2cf60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
2cf70 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ex that might be
2cf80 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61   used for covera
2cf90 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65  ge */.){.  Walke
2cfa0 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64  r w;.  struct Id
2cfb0 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d  xCover xcov;.  m
2cfc0 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
2cfd0 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e  eof(w));.  xcov.
2cfe0 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78  iCur = iCur;.  x
2cff0 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  cov.pIdx = pIdx;
2d000 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2d010 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65  ck = exprIdxCove
2d020 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76  r;.  w.u.pIdxCov
2d030 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71  er = &xcov;.  sq
2d040 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
2d050 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75  , pExpr);.  retu
2d060 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  rn !w.eCode;.}..
2d070 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2d080 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2d090 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2d0a0 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
2d0b0 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63  e walker.** to c
2d0c0 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  ount references 
2d0d0 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  to table columns
2d0e0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
2d0f0 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72  s of an .** aggr
2d100 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  egate function, 
2d110 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
2d120 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c  ement the.** sql
2d130 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73  ite3FunctionThis
2d140 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  Src() routine..*
2d150 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e  /.struct SrcCoun
2d160 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  t {.  SrcList *p
2d170 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61  Src;   /* One pa
2d180 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c  rticular FROM cl
2d190 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64  ause in a nested
2d1a0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
2d1b0 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20  nThis;       /* 
2d1c0 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
2d1d0 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
2d1e0 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  in pSrcList */. 
2d1f0 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20   int nOther;    
2d200 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2d210 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2d220 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52  umns in other FR
2d230 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b  OM clauses */.};
2d240 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
2d250 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2d260 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
2d270 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2d280 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61   exprSrcCount(Wa
2d290 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2d2a0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f  xpr *pExpr){.  /
2d2b0 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e  * The NEVER() on
2d2c0 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d   the second term
2d2d0 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69   is because sqli
2d2e0 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
2d2f0 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73  hisSrc().  ** is
2d300 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62   always called b
2d310 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70  efore sqlite3Exp
2d320 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2d330 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a  es() and so the.
2d340 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20    ** TK_COLUMNs 
2d350 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
2d360 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  n converted into
2d370 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
2d380 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   If.  ** sqlite3
2d390 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
2d3a0 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69  Src() is used di
2d3b0 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  fferently in the
2d3c0 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a   future, the.  *
2d3d0 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e  * NEVER() will n
2d3e0 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eed to be remove
2d3f0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  d. */.  if( pExp
2d400 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2d410 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d   || NEVER(pExpr-
2d420 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
2d430 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  MN) ){.    int i
2d440 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
2d450 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b  Count *p = pWalk
2d460 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b  er->u.pSrcCount;
2d470 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
2d480 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
2d490 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72    int nSrc = pSr
2d4a0 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a  c ? pSrc->nSrc :
2d4b0 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
2d4c0 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20   i<nSrc; i++){. 
2d4d0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
2d4e0 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
2d4f0 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65  i].iCursor ) bre
2d500 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
2d510 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20  ( i<nSrc ){.    
2d520 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20    p->nThis++;.  
2d530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2d540 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20  ->nOther++;.    
2d550 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
2d560 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2d570 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
2d580 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
2d590 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
2d5a0 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
2d5b0 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c  ference.** pSrcL
2d5c0 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ist.  Return tru
2d5d0 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41  e if they do.  A
2d5e0 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20  lso return true 
2d5f0 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  if the function.
2d600 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65  ** has no argume
2d610 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20  nts or has only 
2d620 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
2d630 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ts.  Return fals
2d640 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65  e if pExpr.** re
2d650 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73  ferences columns
2d660 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   but not columns
2d670 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64   of tables found
2d680 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f   in pSrcList..*/
2d690 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63  .int sqlite3Func
2d6a0 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2d6b0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63  Expr *pExpr, Src
2d6c0 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b  List *pSrcList){
2d6d0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
2d6e0 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63  truct SrcCount c
2d6f0 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  nt;.  assert( pE
2d700 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2d710 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e  FUNCTION );.  w.
2d720 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2d730 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20  exprSrcCount;.  
2d740 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2d750 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72  k = 0;.  w.u.pSr
2d760 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20  cCount = &cnt;. 
2d770 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63   cnt.pSrc = pSrc
2d780 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69  List;.  cnt.nThi
2d790 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74  s = 0;.  cnt.nOt
2d7a0 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  her = 0;.  sqlit
2d7b0 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26  e3WalkExprList(&
2d7c0 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  w, pExpr->x.pLis
2d7d0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74  t);.  return cnt
2d7e0 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e  .nThis>0 || cnt.
2d7f0 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  nOther==0;.}../*
2d800 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
2d810 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
2d820 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
2d830 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
2d840 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
2d850 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
2d860 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2d870 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
2d880 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
2d890 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
2d8a0 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
2d8b0 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
2d8c0 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
2d8d0 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
2d8e0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
2d8f0 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
2d900 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
2d910 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
2d920 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
2d930 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
2d940 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
2d950 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
2d960 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
2d970 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
2d980 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
2d990 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
2d9a0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
2d9b0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
2d9c0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
2d9d0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2d9e0 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
2d9f0 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
2da00 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
2da10 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
2da20 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
2da30 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
2da40 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
2da50 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
2da60 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
2da70 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
2da80 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
2da90 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
2daa0 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
2dab0 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
2dac0 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
2dad0 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
2dae0 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
2daf0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
2db00 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
2db10 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
2db20 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
2db30 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2db40 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
2db50 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2db60 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
2db70 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
2db80 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
2db90 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2dba0 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
2dbb0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2dbc0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
2dbd0 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
2dbe0 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
2dbf0 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
2dc00 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
2dc10 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
2dc20 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
2dc30 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
2dc40 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2dc50 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67 67   = pNC->uNC.pAgg
2dc60 49 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  Info;..  assert(
2dc70 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20   pNC->ncFlags & 
2dc80 4e 43 5f 55 41 67 67 49 6e 66 6f 20 29 3b 0a 20  NC_UAggInfo );. 
2dc90 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
2dca0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
2dcb0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
2dcc0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
2dcd0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
2dce0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2dcf0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
2dd00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2dd10 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
2dd20 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  LUMN );.      /*
2dd30 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2dd40 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
2dd50 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
2dd60 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
2dd70 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
2dd80 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
2dd90 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
2dda0 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c  if( ALWAYS(pSrcL
2ddb0 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
2ddc0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2ddd0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2dde0 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
2ddf0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2de00 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
2de10 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2de20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2de30 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
2de40 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  l;.          ass
2de50 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2de60 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2de70 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2de80 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
2de90 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
2dea0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2deb0 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
2dec0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
2ded0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
2dee0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
2def0 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
2df00 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
2df10 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
2df20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2df30 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
2df40 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
2df50 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2df60 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
2df70 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
2df80 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
2df90 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
2dfa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2dfb0 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
2dfc0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
2dfd0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2dfe0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
2dff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
2e000 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
2e010 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
2e020 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
2e030 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
2e040 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
2e050 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2e060 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
2e070 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
2e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2e090 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
2e0a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
2e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2e0d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e0e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2e0f0 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
2e100 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
2e110 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
2e120 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
2e130 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
2e140 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
2e150 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2e160 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
2e170 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
2e180 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
2e190 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
2e1a0 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
2e1b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2e1c0 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
2e1d0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
2e1e0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
2e1f0 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
2e200 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
2e210 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
2e220 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2e230 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e240 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2e250 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
2e260 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
2e270 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
2e280 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2e290 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
2e2a0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
2e2b0 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
2e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
2e2d0 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
2e2e0 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
2e2f0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
2e300 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2e310 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
2e320 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
2e330 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
2e340 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
2e350 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
2e360 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
2e370 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
2e380 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
2e390 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
2e3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e3b0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
2e3c0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
2e3d0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
2e3e0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
2e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2e400 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
2e410 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
2e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e430 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
2e440 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
2e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2e460 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2e470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e480 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e490 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e4a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2e4b0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2e4c0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
2e4d0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
2e4e0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
2e4f0 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
2e500 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
2e510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e530 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
2e540 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
2e550 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
2e560 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
2e570 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
2e580 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
2e590 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
2e5a0 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
2e5b0 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
2e5c0 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
2e5d0 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
2e5e0 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
2e5f0 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
2e600 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
2e610 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
2e620 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
2e630 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2e640 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
2e650 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
2e660 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2e670 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2e680 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
2e690 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
2e6a0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
2e6b0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20  TK_AGG_COLUMN;. 
2e6c0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2e6d0 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b  ->iAgg = (i16)k;
2e6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2e6f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
2e700 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
2e710 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
2e720 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
2e730 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
2e740 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
2e750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2e760 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2e770 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2e780 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
2e790 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e   {.      if( (pN
2e7a0 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
2e7b0 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20  InAggFunc)==0.  
2e7c0 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d       && pWalker-
2e7d0 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45  >walkerDepth==pE
2e7e0 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29  xpr->op2.      )
2e7f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
2e800 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78  ck to see if pEx
2e810 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  pr is a duplicat
2e820 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67  e of another agg
2e830 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20  regate .        
2e840 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ** function that
2e850 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
2e860 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75  he pAggInfo stru
2e870 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f  cture.        */
2e880 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
2e890 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49  AggInfo_func *pI
2e8a0 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  tem = pAggInfo->
2e8b0 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66  aFunc;.        f
2e8c0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
2e8d0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2e8e0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2e8f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2e900 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49  xprCompare(0, pI
2e910 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70  tem->pExpr, pExp
2e920 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  r, -1)==0 ){.   
2e930 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2e940 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e950 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2e960 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e  ( i>=pAggInfo->n
2e970 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
2e980 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72    /* pExpr is or
2e990 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20  iginal.  Make a 
2e9a0 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67  new entry in pAg
2e9b0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20  gInfo->aFunc[]. 
2e9c0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2e9d0 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
2e9e0 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
2e9f0 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64            i = ad
2ea00 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61  dAggInfoFunc(pPa
2ea10 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
2ea20 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
2ea30 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i>=0 ){.      
2ea40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2ea50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2ea60 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2ea70 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ct) );.         
2ea80 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
2ea90 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
2eaa0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2eab0 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
2eac0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2ead0 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  tem->iMem = ++pP
2eae0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2eaf0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2eb00 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2eb10 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
2eb20 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
2eb30 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
2eb40 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
2eb50 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
2eb60 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2eb70 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
2eb80 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  Token, .        
2eb90 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2eba0 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70  ->x.pList ? pExp
2ebb0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
2ebc0 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a  r : 0, enc, 0);.
2ebd0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2ebe0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
2ebf0 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  P_Distinct ){.  
2ec00 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2ec10 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70  m->iDistinct = p
2ec20 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2ec30 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
2ec40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ec50 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
2ec60 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
2ec70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2ec80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ec90 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72     /* Make pExpr
2eca0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70   point to the ap
2ecb0 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e  propriate pAggIn
2ecc0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72  fo->aFunc[] entr
2ecd0 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  y.        */.   
2ece0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2ecf0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2ed00 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
2ed10 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
2ed20 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74  .        ExprSet
2ed30 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
2ed40 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
2ed50 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
2ed60 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20  iAgg = (i16)i;. 
2ed70 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
2ed80 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
2ed90 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
2eda0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
2edb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2edc0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2edd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
2ede0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2edf0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2ee00 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  }.static int ana
2ee10 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
2ee20 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70  Select(Walker *p
2ee30 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
2ee40 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53  pSelect){.  UNUS
2ee50 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65  ED_PARAMETER(pSe
2ee60 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72  lect);.  pWalker
2ee70 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b  ->walkerDepth++;
2ee80 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2ee90 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
2eea0 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67   void analyzeAgg
2eeb0 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45  regatesInSelectE
2eec0 6e 64 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nd(Walker *pWalk
2eed0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  er, Select *pSel
2eee0 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ect){.  UNUSED_P
2eef0 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74  ARAMETER(pSelect
2ef00 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61  );.  pWalker->wa
2ef10 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a  lkerDepth--;.}..
2ef20 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
2ef30 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
2ef40 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
2ef50 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2ef60 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
2ef70 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
2ef80 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
2ef90 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
2efa0 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e  that pNC->pAggIn
2efb0 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e  fo.** points to.
2efc0 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74    Additional ent
2efd0 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e  ries are made on
2efe0 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a   the AggInfo obj
2eff0 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73  ect as.** necess
2f000 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
2f010 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
2f020 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
2f030 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
2f040 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
2f050 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
2f060 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
2f070 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  es()..*/.void sq
2f080 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2f090 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43  Aggregates(NameC
2f0a0 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
2f0b0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c  r *pExpr){.  Wal
2f0c0 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
2f0d0 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
2f0e0 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77  zeAggregate;.  w
2f0f0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2f100 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2f110 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20  atesInSelect;.  
2f120 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2f130 6b 32 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  k2 = analyzeAggr
2f140 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e  egatesInSelectEn
2f150 64 3b 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70  d;.  w.walkerDep
2f160 74 68 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e  th = 0;.  w.u.pN
2f170 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72  C = pNC;.  asser
2f180 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  t( pNC->pSrcList
2f190 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
2f1a0 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
2f1b0 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  pr);.}../*.** Ca
2f1c0 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ll sqlite3ExprAn
2f1d0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2f1e0 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72  ) for every expr
2f1f0 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20  ession in an.** 
2f200 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
2f210 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
2f220 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
2f230 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2f240 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61   is found, the a
2f250 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73  nalysis is cut s
2f260 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hort..*/.void sq
2f270 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2f280 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74  AggList(NameCont
2f290 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69  ext *pNC, ExprLi
2f2a0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74  st *pList){.  st
2f2b0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2f2c0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
2f2d0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   i;.  if( pList 
2f2e0 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d  ){.    for(pItem
2f2f0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
2f300 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
2f310 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2f320 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2f330 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2f340 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45  s(pNC, pItem->pE
2f350 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
2f360 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2f370 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72  e a single new r
2f380 65 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20  egister for use 
2f390 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74  to hold some int
2f3a0 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
2f3b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2f3c0 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65  GetTempReg(Parse
2f3d0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
2f3e0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2f3f0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  g==0 ){.    retu
2f400 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65  rn ++pParse->nMe
2f410 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  m;.  }.  return 
2f420 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2f430 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  [--pParse->nTemp
2f440 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Reg];.}../*.** D
2f450 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69  eallocate a regi
2f460 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61  ster, making ava
2f470 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
2f480 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a   for some other.
2f490 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a  ** purpose..**.*
2f4a0 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
2f4b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  is currently bei
2f4c0 6e 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ng used by the c
2f4d0 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65  olumn cache, the
2f4e0 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c 6c 6f 63  n.** the dealloc
2f4f0 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65  ation is deferre
2f500 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75  d until the colu
2f510 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68  mn cache line th
2f520 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72  at uses.** the r
2f530 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20  egister becomes 
2f540 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  stale..*/.void s
2f550 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2f560 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
2f570 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  se, int iReg){. 
2f580 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61   if( iReg && pPa
2f590 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
2f5a0 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
2f5b0 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20  aTempReg) ){.   
2f5c0 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
2f5d0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
2f5e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  .    for(i=0, p=
2f5f0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
2f600 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e; i<pParse->nCo
2f610 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b  lCache; i++, p++
2f620 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
2f630 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
2f640 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
2f650 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
2f660 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
2f670 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
2f680 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
2f690 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69  >nTempReg++] = i
2f6a0 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
2f6b0 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65  * Allocate or de
2f6c0 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b  allocate a block
2f6d0 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75   of nReg consecu
2f6e0 74 69 76 65 20 72 65 67 69 73 74 65 72 73 2e 0a  tive registers..
2f6f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2f700 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  tTempRange(Parse
2f710 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52   *pParse, int nR
2f720 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  eg){.  int i, n;
2f730 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29  .  if( nReg==1 )
2f740 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47   return sqlite3G
2f750 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2f760 29 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  );.  i = pParse-
2f770 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
2f780 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
2f790 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
2f7a0 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =n ){.    assert
2f7b0 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  ( !usedAsColumnC
2f7c0 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20  ache(pParse, i, 
2f7d0 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50  i+n-1) );.    pP
2f7e0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2f7f0 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61  += nReg;.    pPa
2f800 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d  rse->nRangeReg -
2f810 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  = nReg;.  }else{
2f820 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d  .    i = pParse-
2f830 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
2f840 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
2f850 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
2f860 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  i;.}.void sqlite
2f870 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2f880 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2f890 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
2f8a0 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67  Reg){.  if( nReg
2f8b0 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
2f8c0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
2f8d0 28 70 50 61 72 73 65 2c 20 69 52 65 67 29 3b 0a  (pParse, iReg);.
2f8e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2f8f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2f900 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
2f910 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20   iReg, nReg);.  
2f920 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d  if( nReg>pParse-
2f930 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20  >nRangeReg ){.  
2f940 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
2f950 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  Reg = nReg;.    
2f960 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2f970 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  g = iReg;.  }.}.
2f980 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20  ./*.** Mark all 
2f990 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
2f9a0 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61  ers as being una
2f9b0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
2f9c0 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
2f9d0 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
2f9e0 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
2f9f0 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  se){.  pParse->n
2fa00 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70  TempReg = 0;.  p
2fa10 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2fa20 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56   = 0;.}../*.** V
2fa30 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e 6f 20  alidate that no 
2fa40 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
2fa50 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 20  er falls within 
2fa60 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20  the range of.** 
2fa70 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69  iFirst..iLast, i
2fa80 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69 73 20  nclusive.  This 
2fa90 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
2faa0 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e  call from within
2fab0 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61   assert().** sta
2fac0 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64  tements..*/.#ifd
2fad0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2fae0 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d  int sqlite3NoTem
2faf0 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73 65 20  psInRange(Parse 
2fb00 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 69  *pParse, int iFi
2fb10 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b  rst, int iLast){
2fb20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2fb30 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2fb40 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72 73 65  g>0.   && pParse
2fb50 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50 61 72  ->iRangeReg+pPar
2fb60 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3e 20  se->nRangeReg > 
2fb70 69 46 69 72 73 74 0a 20 20 20 26 26 20 70 50 61  iFirst.   && pPa
2fb80 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3c  rse->iRangeReg <
2fb90 3d 20 69 4c 61 73 74 0a 20 20 29 7b 0a 20 20 20  = iLast.  ){.   
2fba0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2fbb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
2fbc0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69  rse->nTempReg; i
2fbd0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
2fbe0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d  rse->aTempReg[i]
2fbf0 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50 61 72  >=iFirst && pPar
2fc00 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c  se->aTempReg[i]<
2fc10 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  =iLast ){.      
2fc20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
2fc30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
2fc40 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2fc50 54 45 5f 44 45 42 55 47 20 2a 2f 0a              TE_DEBUG */.