/ Hex Artifact Content
Login

Artifact 75cef2e9fa3318c284faeea2c259100b7538776ca47573bf45b7b45c06ba0825:


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 70 4e 65  gg = -1;.    pNe
6690: 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20  w->pWin = 0;.   
66a0: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
66b0: 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d       if( nExtra=
66c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  =0 ){.        pN
66d0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
66e0: 49 6e 74 56 61 6c 75 65 7c 45 50 5f 4c 65 61 66  IntValue|EP_Leaf
66f0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
6700: 75 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c 75  u.iValue = iValu
6710: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
6720: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
6730: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
6740: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20  &pNew[1];.      
6750: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
6760: 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e  ->z!=0 || pToken
6770: 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->n==0 );.      
6780: 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20    if( pToken->n 
6790: 29 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75  ) memcpy(pNew->u
67a0: 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d  .zToken, pToken-
67b0: 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a  >z, pToken->n);.
67c0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
67d0: 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e  zToken[pToken->n
67e0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  ] = 0;.        i
67f0: 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 73 71  f( dequote && sq
6800: 6c 69 74 65 33 49 73 71 75 6f 74 65 28 70 4e 65  lite3Isquote(pNe
6810: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20  w->u.zToken[0]) 
6820: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
6830: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
6840: 30 5d 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e  0]=='"' ) pNew->
6850: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51  flags |= EP_DblQ
6860: 75 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20  uoted;.         
6870: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
6880: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  pNew->u.zToken);
6890: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
68a0: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c   }.    }.#if SQL
68b0: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
68c0: 54 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  TH>0.    pNew->n
68d0: 48 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64  Height = 1;.#end
68e0: 69 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  if  .  }.  retur
68f0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
6900: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
6910: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
6920: 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d  from a zero-term
6930: 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61  inated token tha
6940: 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79  t has.** already
6950: 20 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a   been dequoted..
6960: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6970: 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
6980: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
6990: 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71  /* Handle for sq
69a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
69b0: 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c  o() (may be null
69c0: 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  ) */.  int op,  
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
69e0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
69f0: 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
6a00: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20  har *zToken     
6a10: 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65   /* Token argume
6a20: 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  nt.  Might be NU
6a30: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e  LL */.){.  Token
6a40: 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b   x;.  x.z = zTok
6a50: 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c 69  en;.  x.n = sqli
6a60: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b  te3Strlen30(zTok
6a70: 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  en);.  return sq
6a80: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
6a90: 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d  b, op, &x, 0);.}
6aa0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73  ../*.** Attach s
6ab0: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
6ac0: 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20  d pRight to the 
6ad0: 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e  Expr node pRoot.
6ae0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d  .**.** If pRoot=
6af0: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
6b00: 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61   that a memory a
6b10: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
6b20: 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  has occurred..**
6b30: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
6b40: 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65  elete the subtre
6b50: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
6b60: 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ght..*/.void sql
6b70: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
6b80: 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65  btrees(.  sqlite
6b90: 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70  3 *db,.  Expr *p
6ba0: 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c  Root,.  Expr *pL
6bb0: 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69  eft,.  Expr *pRi
6bc0: 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f  ght.){.  if( pRo
6bd0: 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ot==0 ){.    ass
6be0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
6bf0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
6c00: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6c10: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
6c20: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6c30: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
6c40: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
6c50: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
6c60: 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  Root->pRight = p
6c70: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f  Right;.      pRo
6c80: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
6c90: 50 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67  Propagate & pRig
6ca0: 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ht->flags;.    }
6cb0: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29  .    if( pLeft )
6cc0: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
6cd0: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
6ce0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
6cf0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
6d00: 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b   & pLeft->flags;
6d10: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53  .    }.    exprS
6d20: 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b  etHeight(pRoot);
6d30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
6d40: 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e  locate an Expr n
6d50: 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20  ode which joins 
6d60: 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73  as many as two s
6d70: 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  ubtrees..**.** O
6d80: 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
6d90: 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62  e subtrees can b
6da0: 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20  e NULL.  Return 
6db0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
6dc0: 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64   new.** Expr nod
6dd0: 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f  e.  Or, if an OO
6de0: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
6df0: 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  set pParse->db->
6e00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a  mallocFailed,.**
6e10: 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65   free the subtre
6e20: 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  es and return NU
6e30: 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  LL..*/.Expr *sql
6e40: 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72  ite3PExpr(.  Par
6e50: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6e60: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
6e70: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
6e80: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6e90: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6ea0: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
6eb0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
6ec0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
6ed0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
6ee0: 20 2a 70 52 69 67 68 74 20 20 20 20 20 20 20 20   *pRight        
6ef0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
6f00: 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  rand */.){.  Exp
6f10: 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r *p;.  if( op==
6f20: 54 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73 65  TK_AND && pParse
6f30: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
6f40: 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61   /* Take advanta
6f50: 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63  ge of short-circ
6f60: 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69  uit false optimi
6f70: 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a  zation for AND *
6f80: 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  /.    p = sqlite
6f90: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
6fa0: 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  >db, pLeft, pRig
6fb0: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
6fc0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
6fd0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
6fe0: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  e->db, sizeof(Ex
6ff0: 70 72 29 29 3b 0a 20 20 20 20 69 66 28 20 70 20  pr));.    if( p 
7000: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
7010: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  p, 0, sizeof(Exp
7020: 72 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 70  r));.      p->op
7030: 20 3d 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d 41   = op & TKFLG_MA
7040: 53 4b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 67  SK;.      p->iAg
7050: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d  g = -1;.      p-
7060: 3e 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  >pWin = 0;.    }
7070: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7080: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70  AttachSubtrees(p
7090: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c  Parse->db, p, pL
70a0: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
70b0: 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20  }.  if( p ) {.  
70c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
70d0: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
70e0: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20   p->nHeight);.  
70f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
7100: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65  ./*.** Add pSele
7110: 63 74 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78  ct to the Expr.x
7120: 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20  .pSelect field. 
7130: 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20 69 73   Or, if pExpr is
7140: 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f   NULL (due.** do
7150: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
7160: 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68  tion failure) th
7170: 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 70 53  en delete the pS
7180: 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  elect object..*/
7190: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78  .void sqlite3PEx
71a0: 70 72 41 64 64 53 65 6c 65 63 74 28 50 61 72 73  prAddSelect(Pars
71b0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
71c0: 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a  *pExpr, Select *
71d0: 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20  pSelect){.  if( 
71e0: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78  pExpr ){.    pEx
71f0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  pr->x.pSelect = 
7200: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70  pSelect;.    Exp
7210: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
7220: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
7230: 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20  |EP_Subquery);. 
7240: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65     sqlite3ExprSe
7250: 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28  tHeightAndFlags(
7260: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
7270: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
7280: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
7290: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
72a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
72b0: 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  ctDelete(pParse-
72c0: 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  >db, pSelect);. 
72d0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   }.}.../*.** If 
72e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
72f0: 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
7300: 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72  TRUE or FALSE (r
7310: 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a  espectively),.**
7320: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20   then return 1. 
7330: 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64   If one cannot d
7340: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75  etermine the tru
7350: 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  th value of the.
7360: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  ** expression at
7370: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65   compile-time re
7380: 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  turn 0..**.** Th
7390: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
73a0: 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b  ation.  If is OK
73b0: 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72   to return 0 her
73c0: 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  e even if.** the
73d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c   expression real
73e0: 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  ly is always fal
73f0: 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66  se or false (a f
7400: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a  alse negative)..
7410: 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20 62  ** But it is a b
7420: 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69  ug to return 1 i
7430: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
7440: 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66 66   might have diff
7450: 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e  erent.** boolean
7460: 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65   values in diffe
7470: 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63  rent circumstanc
7480: 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69  es (a false posi
7490: 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74  tive.).**.** Not
74a0: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78  e that if the ex
74b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74  pression is part
74c0: 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   of conditional 
74d0: 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f  for a.** LEFT JO
74e0: 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e  IN, then we cann
74f0: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20  ot determine at 
7500: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
7510: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69  ther or not.** i
7520: 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c  s it true or fal
7530: 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65  se, so always re
7540: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
7550: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
7560: 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  True(Expr *p){. 
7570: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66   int v = 0;.  if
7580: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
7590: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
75a0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
75b0: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
75c0: 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29  IsInteger(p, &v)
75d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
75e0: 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74  eturn v!=0;.}.st
75f0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77  atic int exprAlw
7600: 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70  aysFalse(Expr *p
7610: 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a  ){.  int v = 0;.
7620: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
7630: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
7640: 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
7650: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
7660: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c  ExprIsInteger(p,
7670: 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b   &v) ) return 0;
7680: 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a  .  return v==0;.
7690: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
76a0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
76b0: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
76c0: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
76d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
76e0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
76f0: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
7700: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
7710: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
7720: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
7730: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
7740: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
7750: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
7760: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
7770: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
7780: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
7790: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
77a0: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
77b0: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
77c0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
77d0: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  d(sqlite3 *db, E
77e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
77f0: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
7800: 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   pLeft==0 ){.   
7810: 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a   return pRight;.
7820: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
7830: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ht==0 ){.    ret
7840: 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c  urn pLeft;.  }el
7850: 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
7860: 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c  sFalse(pLeft) ||
7870: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
7880: 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (pRight) ){.    
7890: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
78a0: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
78b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
78c0: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
78d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
78e0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
78f0: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
7900: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30  lite3IntTokens[0
7910: 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ], 0);.  }else{.
7920: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
7930: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
7940: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
7950: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
7960: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
7970: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
7980: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
7990: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
79a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
79b0: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
79c0: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
79d0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
79e0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
79f0: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
7a00: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
7a10: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
7a20: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
7a30: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
7a40: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
7a50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7a60: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
7a70: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
7a80: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
7a90: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7aa0: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
7ab0: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
7ac0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
7ad0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
7ae0: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
7af0: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
7b00: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
7b10: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
7b20: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
7b30: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
7b40: 73 74 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f  st;.  ExprSetPro
7b50: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 48  perty(pNew, EP_H
7b60: 61 73 46 75 6e 63 29 3b 0a 20 20 61 73 73 65 72  asFunc);.  asser
7b70: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
7b80: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
7b90: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
7ba0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
7bb0: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
7bc0: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
7bd0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7be0: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
7bf0: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
7c00: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
7c10: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
7c20: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
7c30: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
7c40: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
7c50: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
7c60: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
7c70: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
7c80: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
7c90: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
7ca0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
7cb0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
7cc0: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
7cd0: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
7ce0: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
7cf0: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
7d00: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20 74  is not too big t
7d10: 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c  o avoid a denial
7d20: 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61   of service atta
7d30: 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53  ck when.** the S
7d40: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d  QL statement com
7d50: 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72  es from an exter
7d60: 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a  nal source..**.*
7d70: 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74  * Wildcards of t
7d80: 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20  he form ":aaa", 
7d90: 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61  "@aaa", or "$aaa
7da0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
7db0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
7dc0: 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  * as the previou
7dd0: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  s instance of th
7de0: 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e  e same wildcard.
7df0: 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20    Or if this is 
7e00: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73  the first.** ins
7e10: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c  tance of the wil
7e20: 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20  dcard, the next 
7e30: 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61  sequential varia
7e40: 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ble number is.**
7e50: 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f   assigned..*/.vo
7e60: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  id sqlite3ExprAs
7e70: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61  signVarNumber(Pa
7e80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
7e90: 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e 29  r *pExpr, u32 n)
7ea0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
7eb0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
7ed0: 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66 28   ynVar x;..  if(
7ee0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
7ef0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  rn;.  assert( !E
7f00: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7f10: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
7f20: 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  e|EP_Reduced|EP_
7f30: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20  TokenOnly) );.  
7f40: 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  z = pExpr->u.zTo
7f50: 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  ken;.  assert( z
7f60: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7f70: 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61 73   z[0]!=0 );.  as
7f80: 73 65 72 74 28 20 6e 3d 3d 28 75 33 32 29 73 71  sert( n==(u32)sq
7f90: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
7fa0: 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d   );.  if( z[1]==
7fb0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  0 ){.    /* Wild
7fc0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
7fd0: 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68   "?".  Assign th
7fe0: 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20  e next variable 
7ff0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73  number */.    as
8000: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20  sert( z[0]=='?' 
8010: 29 3b 0a 20 20 20 20 78 20 3d 20 28 79 6e 56 61  );.    x = (ynVa
8020: 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61  r)(++pParse->nVa
8030: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
8040: 20 69 6e 74 20 64 6f 41 64 64 20 3d 20 30 3b 0a   int doAdd = 0;.
8050: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
8060: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
8070: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
8080: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
8090: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
80a0: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
80b0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
80c0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
80d0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
80e0: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
80f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 32  ;.      if( n==2
8100: 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49   ){ /*OPTIMIZATI
8110: 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20 20  ON-IF-TRUE*/.   
8120: 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d 2d 27 30       i = z[1]-'0
8130: 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  ';  /* The commo
8140: 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20 66 6f 72  n case of ?N for
8150: 20 61 20 73 69 6e 67 6c 65 20 64 69 67 69 74 20   a single digit 
8160: 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6b  N */.        bOk
8170: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
8180: 65 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d  e{.        bOk =
8190: 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36   0==sqlite3Atoi6
81a0: 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31  4(&z[1], &i, n-1
81b0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
81c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
81d0: 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a  stcase( i==0 );.
81e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
81f0: 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  i==1 );.      te
8200: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
8210: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
8220: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
8230: 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  ER]-1 );.      t
8240: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
8250: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8260: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
8270: 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66  BER] );.      if
8280: 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20  ( bOk==0 || i<1 
8290: 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  || i>db->aLimit[
82a0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
82b0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
82c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
82d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
82e0: 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65   "variable numbe
82f0: 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  r must be betwee
8300: 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20  n ?1 and ?%d",. 
8310: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61             db->a
8320: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
8330: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
8340: 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ER]);.        re
8350: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
8360: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 69      x = (ynVar)i
8370: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50  ;.      if( x>pP
8380: 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20  arse->nVar ){.  
8390: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
83a0: 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20 20 20  ar = (int)x;.   
83b0: 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a       doAdd = 1;.
83c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
83d0: 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54  sqlite3VListNumT
83e0: 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56  oName(pParse->pV
83f0: 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b 0a 20  List, x)==0 ){. 
8400: 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31         doAdd = 1
8410: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8420: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  lse{.      /* Wi
8430: 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61  ldcards like ":a
8440: 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22  aa", "$aaa" or "
8450: 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  @aaa".  Reuse th
8460: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
8470: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
8480: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
8490: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
84a0: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
84b0: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a  the name.      *
84c0: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
84d0: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
84e0: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
84f0: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
8500: 20 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 28    */.      x = (
8510: 79 6e 56 61 72 29 73 71 6c 69 74 65 33 56 4c 69  ynVar)sqlite3VLi
8520: 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50 61 72  stNameToNum(pPar
8530: 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e  se->pVList, z, n
8540: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3d 3d  );.      if( x==
8550: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20 3d  0 ){.        x =
8560: 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73   (ynVar)(++pPars
8570: 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20 20  e->nVar);.      
8580: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
8590: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
85a0: 66 28 20 64 6f 41 64 64 20 29 7b 0a 20 20 20 20  f( doAdd ){.    
85b0: 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74    pParse->pVList
85c0: 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74 41   = sqlite3VListA
85d0: 64 64 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70  dd(db, pParse->p
85e0: 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b  VList, z, n, x);
85f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78  .    }.  }.  pEx
8600: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b  pr->iColumn = x;
8610: 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e 61 4c 69  .  if( x>db->aLi
8620: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8630: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
8640: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
8650: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8660: 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76   "too many SQL v
8670: 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a  ariables");.  }.
8680: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69  }../*.** Recursi
8690: 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65  vely delete an e
86a0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
86b0: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
86c0: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73  _NOINLINE void s
86d0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
86e0: 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  NN(sqlite3 *db, 
86f0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73 65  Expr *p){.  asse
8700: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a  rt( p!=0 );.  /*
8710: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41   Sanity check: A
8720: 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49  ssert that the I
8730: 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e  ntValue is non-n
8740: 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78  egative if it ex
8750: 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ists */.  assert
8760: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8770: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
8780: 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75  e) || p->u.iValu
8790: 65 3e 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53  e>=0 );.#ifdef S
87a0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
87b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
87c0: 79 28 70 2c 20 45 50 5f 4c 65 61 66 29 20 26 26  y(p, EP_Leaf) &&
87d0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
87e0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
87f0: 79 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  y) ){.    assert
8800: 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b  ( p->pLeft==0 );
8810: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8820: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
8830: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 53   assert( p->x.pS
8840: 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a  elect==0 );.  }.
8850: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 45 78  #endif.  if( !Ex
8860: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8870: 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45   (EP_TokenOnly|E
8880: 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20  P_Leaf)) ){.    
8890: 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e  /* The Expr.x un
88a0: 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65  ion is never use
88b0: 64 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  d at the same ti
88c0: 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68  me as Expr.pRigh
88d0: 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
88e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
88f0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
8900: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
8910: 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f  ft && p->op!=TK_
8920: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20  SELECT_COLUMN ) 
8930: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8940: 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  eNN(db, p->pLeft
8950: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  );.    if( p->pR
8960: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
8970: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8980: 4e 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29  N(db, p->pRight)
8990: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
89a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
89b0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
89c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
89d0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
89e0: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  , p->x.pSelect);
89f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8a00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8a10: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
8a20: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
8a30: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
8a40: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
8a50: 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20  duced) ){.      
8a60: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c  sqlite3WindowDel
8a70: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 6e 29  ete(db, p->pWin)
8a80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8a90: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8aa0: 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  y(p, EP_MemToken
8ab0: 29 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  ) ) sqlite3DbFre
8ac0: 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e(db, p->u.zToke
8ad0: 6e 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  n);.  if( !ExprH
8ae0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8af0: 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  _Static) ){.    
8b00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
8b10: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  db, p);.  }.}.vo
8b20: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
8b30: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
8b40: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
8b50: 28 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70  ( p ) sqlite3Exp
8b60: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29  rDeleteNN(db, p)
8b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8b80: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8b90: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
8ba0: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
8bb0: 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  on structure .**
8bc0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
8bd0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
8be0: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  his is always on
8bf0: 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49  e of EXPR_FULLSI
8c00: 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55  ZE,.** EXPR_REDU
8c10: 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f  CEDSIZE or EXPR_
8c20: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a  TOKENONLYSIZE..*
8c30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
8c40: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
8c50: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
8c60: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8c70: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72  P_TokenOnly) ) r
8c80: 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e  eturn EXPR_TOKEN
8c90: 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20  ONLYSIZE;.  if( 
8ca0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8cb0: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  p, EP_Reduced) )
8cc0: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44   return EXPR_RED
8cd0: 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75  UCEDSIZE;.  retu
8ce0: 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  rn EXPR_FULLSIZE
8cf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
8d00: 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20  upedExpr*Size() 
8d10: 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65  routines each re
8d20: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8d30: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
8d40: 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20  d.** to store a 
8d50: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
8d60: 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73  ssion or express
8d70: 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20  ion tree.  They 
8d80: 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77  differ in.** how
8d90: 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65   much of the tre
8da0: 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a  e is measured..*
8db0: 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  *.**     dupedEx
8dc0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20  prStructSize()  
8dd0: 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20     Size of only 
8de0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
8df0: 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  re .**     duped
8e00: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20  ExprNodeSize()  
8e10: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70       Size of Exp
8e20: 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f  r + space for to
8e30: 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  ken.**     duped
8e40: 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20  ExprSize()      
8e50: 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65       Expr + toke
8e60: 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70  n + subtree comp
8e70: 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  onents.**.******
8e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ec0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
8ed0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8ee0: 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72  ize() function r
8ef0: 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65  eturns two value
8f00: 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72  s OR-ed together
8f10: 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73  :  .** (1) the s
8f20: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
8f30: 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  r a copy of the 
8f40: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f  Expr structure o
8f50: 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20  nly and .** (2) 
8f60: 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73  the EP_xxx flags
8f70: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77   that indicate w
8f80: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
8f90: 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  e size should be
8fa0: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
8fb0: 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73  values is always
8fc0: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
8fd0: 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a      EXPR_FULLSIZ
8fe0: 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52  E.**      EXPR_R
8ff0: 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45  EDUCEDSIZE   | E
9000: 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20  P_Reduced.**    
9010: 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59    EXPR_TOKENONLY
9020: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
9030: 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  nly.**.** The si
9040: 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ze of the struct
9050: 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ure can be found
9060: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20   by masking the 
9070: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
9080: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
9090: 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65  with 0xfff.  The
90a0: 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f   flags can be fo
90b0: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
90c0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
90d0: 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63  ue with EP_Reduc
90e0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e  ed|EP_TokenOnly.
90f0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
9100: 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50   with flags==EXP
9110: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69  RDUP_REDUCE, thi
9120: 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73  s routines works
9130: 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a   on full-size.**
9140: 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70   (unreduced) Exp
9150: 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65  r objects as the
9160: 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20  y or originally 
9170: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
9180: 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75  he parser..** Du
9190: 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  ring expression 
91a0: 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20  analysis, extra 
91b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63  information is c
91c0: 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65  omputed and move
91d0: 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20  d into.** later 
91e0: 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70  parts of teh Exp
91f0: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  r object and tha
9200: 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  t extra informat
9210: 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68  ion might get ch
9220: 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20  opped.** off if 
9230: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9240: 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65  s reduced.  Note
9250: 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f   also that it do
9260: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a  es not work to.*
9270: 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55  * make an EXPRDU
9280: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
9290: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
92a0: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
92b0: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
92c0: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
92d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
92e0: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
92f0: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
9300: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
9310: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
9320: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
9330: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
9340: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
9350: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
9360: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
9370: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
9380: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
9390: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
93a0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
93b0: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
93c0: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
93d0: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
93e0: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
93f0: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
9400: 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  owed */.  assert
9410: 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c  ( EXPR_FULLSIZE<
9420: 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65  =0xfff );.  asse
9430: 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50  rt( (0xfff & (EP
9440: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
9450: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
9460: 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20  if( 0==flags || 
9470: 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
9480: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6e  _COLUMN ){.    n
9490: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
94a0: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
94b0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
94c0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
94d0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
94e0: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
94f0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9500: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
9510: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
9520: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9530: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
9540: 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20  emToken) );.    
9550: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9560: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
9570: 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20  oReduce) );.    
9580: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20  if( p->pLeft || 
9590: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
95a0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
95b0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45  _REDUCEDSIZE | E
95c0: 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d  P_Reduced;.    }
95d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
95e0: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
95f0: 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   );.      nSize 
9600: 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  = EXPR_TOKENONLY
9610: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
9620: 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nly;.    }.  }. 
9630: 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d   return nSize;.}
9640: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9650: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
9660: 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  e space in bytes
9670: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
9680: 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20  re the copy .** 
9690: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
96a0: 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79  cture and a copy
96b0: 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a   of the Expr.u.z
96c0: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
96d0: 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20   that.** string 
96e0: 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a  is defined.).*/.
96f0: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
9700: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70  ExprNodeSize(Exp
9710: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
9720: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
9730: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
9740: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20  ize(p, flags) & 
9750: 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78  0xfff;.  if( !Ex
9760: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9770: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9780: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9790: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
97a0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
97b0: 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d  u.zToken)+1;.  }
97c0: 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
97d0: 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (nByte);.}../*.*
97e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
97f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
9800: 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20  uired to create 
9810: 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74  a duplicate of t
9820: 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  he .** expressio
9830: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
9840: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
9850: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
9860: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b  ent is a.** mask
9870: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52   containing EXPR
9880: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
9890: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
98a0: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
98b0: 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65   space to create
98c0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
98d0: 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74  xpr struct.** it
98e0: 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66  self and the buf
98f0: 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20  fer referred to 
9900: 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  by Expr.u.zToken
9910: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  , if any..**.** 
9920: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
9930: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
9940: 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  t, then the retu
9950: 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65  rn value include
9960: 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64  s .** space to d
9970: 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70  uplicate all Exp
9980: 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74  r nodes in the t
9990: 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78  ree formed by Ex
99a0: 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64  pr.pLeft .** and
99b0: 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72   Expr.pRight var
99c0: 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20  iables (but not 
99d0: 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72  for any structur
99e0: 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72  es pointed to or
99f0: 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66   .** descended f
9a00: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
9a10: 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70  List or Expr.x.p
9a20: 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73  Select variables
9a30: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
9a40: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45   dupedExprSize(E
9a50: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
9a60: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
9a70: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
9a80: 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65      nByte = dupe
9a90: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
9aa0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
9ab0: 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52   flags&EXPRDUP_R
9ac0: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e  EDUCE ){.      n
9ad0: 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70  Byte += dupedExp
9ae0: 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20  rSize(p->pLeft, 
9af0: 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78  flags) + dupedEx
9b00: 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74  prSize(p->pRight
9b10: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
9b20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79    }.  return nBy
9b30: 74 65 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 57 69  te;.}..static Wi
9b40: 6e 64 6f 77 20 2a 77 69 6e 44 75 70 28 73 71 6c  ndow *winDup(sql
9b50: 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77  ite3 *db, Window
9b60: 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a   *p){.  Window *
9b70: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 66 28 20  pNew = 0;.  if( 
9b80: 70 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  p ){.    pNew = 
9b90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
9ba0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  ero(db, sizeof(W
9bb0: 69 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69 66 28  indow));.    if(
9bc0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70   pNew ){.      p
9bd0: 4e 65 77 2d 3e 70 46 69 6c 74 65 72 20 3d 20 73  New->pFilter = s
9be0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
9bf0: 2c 20 70 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29  , p->pFilter, 0)
9c00: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  ;.      pNew->pP
9c10: 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74  artition = sqlit
9c20: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
9c30: 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c  , p->pPartition,
9c40: 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
9c50: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
9c60: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
9c70: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
9c80: 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
9c90: 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65  eType = p->eType
9ca0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 45  ;.      pNew->eE
9cb0: 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20  nd = p->eEnd;.  
9cc0: 20 20 20 20 70 4e 65 77 2d 3e 65 53 74 61 72 74      pNew->eStart
9cd0: 20 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20   = p->eStart;.  
9ce0: 20 20 20 20 70 4e 65 77 2d 3e 70 53 74 61 72 74      pNew->pStart
9cf0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
9d00: 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 74 61  p(db, pNew->pSta
9d10: 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  rt, 0);.      pN
9d20: 65 77 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74  ew->pEnd = sqlit
9d30: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e  e3ExprDup(db, pN
9d40: 65 77 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20  ew->pEnd, 0);.  
9d50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9d60: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
9d70: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
9d80: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
9d90: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
9da0: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
9db0: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
9dc0: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
9dd0: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
9de0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
9df0: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
9e00: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
9e10: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
9e20: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
9e30: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
9e40: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
9e50: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
9e60: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
9e70: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
9e80: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
9e90: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
9ea0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
9eb0: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
9ec0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
9ed0: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72   past the.** por
9ee0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
9ef0: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
9f00: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
9f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
9f20: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
9f30: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
9f40: 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20  nt dupFlags, u8 
9f50: 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45  **pzBuffer){.  E
9f60: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
9f70: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
9f80: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20   return */.  u8 
9f90: 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  *zAlloc;        
9fa0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61     /* Memory spa
9fb0: 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  ce from which to
9fc0: 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65   build Expr obje
9fd0: 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74  ct */.  u32 stat
9fe0: 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  icFlag;       /*
9ff0: 20 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70   EP_Static if sp
a000: 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64  ace not obtained
a010: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a   from malloc */.
a020: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
a030: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20   );.  assert( p 
a040: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70  );.  assert( dup
a050: 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46  Flags==0 || dupF
a060: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
a070: 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74  DUCE );.  assert
a080: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
a090: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
a0a0: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20  UP_REDUCE );..  
a0b0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
a0c0: 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
a0d0: 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74   new Expr struct
a0e0: 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a  ure. */.  if( pz
a0f0: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41  Buffer ){.    zA
a100: 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72  lloc = *pzBuffer
a110: 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67  ;.    staticFlag
a120: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
a130: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f  }else{.    zAllo
a140: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
a150: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70  locRawNN(db, dup
a160: 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75  edExprSize(p, du
a170: 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74  pFlags));.    st
a180: 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20  aticFlag = 0;.  
a190: 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72  }.  pNew = (Expr
a1a0: 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66   *)zAlloc;..  if
a1b0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a  ( pNew ){.    /*
a1c0: 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f   Set nNewSize to
a1d0: 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61   the size alloca
a1e0: 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75  ted for the stru
a1f0: 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
a200: 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e  .    ** by pNew.
a210: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
a220: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
a230: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
a240: 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54  or.    ** EXPR_T
a250: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54  OKENONLYSIZE. nT
a260: 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
a270: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
a280: 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20  es consumed.    
a290: 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f  ** by the copy o
a2a0: 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65  f the p->u.zToke
a2b0: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79  n string (if any
a2c0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f  )..    */.    co
a2d0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74  nst unsigned nSt
a2e0: 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64  ructSize = duped
a2f0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
a300: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a310: 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53   const int nNewS
a320: 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a  ize = nStructSiz
a330: 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69  e & 0xfff;.    i
a340: 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69  nt nToken;.    i
a350: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a360: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
a370: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
a380: 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b  en ){.      nTok
a390: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
a3a0: 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  en30(p->u.zToken
a3b0: 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  ) + 1;.    }else
a3c0: 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d  {.      nToken =
a3d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
a3e0: 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20  ( dupFlags ){.  
a3f0: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
a400: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
a410: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
a420: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41  .      memcpy(zA
a430: 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a  lloc, p, nNewSiz
a440: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
a450: 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d       u32 nSize =
a460: 20 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74   (u32)exprStruct
a470: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d  Size(p);.      m
a480: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
a490: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69   nSize);.      i
a4a0: 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55  f( nSize<EXPR_FU
a4b0: 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20  LLSIZE ){ .     
a4c0: 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f     memset(&zAllo
a4d0: 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50  c[nSize], 0, EXP
a4e0: 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65  R_FULLSIZE-nSize
a4f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a500: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
a510: 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f   EP_Reduced, EP_
a520: 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45  TokenOnly, and E
a530: 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61  P_Static flags a
a540: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f  ppropriately. */
a550: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
a560: 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64   &= ~(EP_Reduced
a570: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  |EP_TokenOnly|EP
a580: 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f  _Static|EP_MemTo
a590: 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ken);.    pNew->
a5a0: 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74  flags |= nStruct
a5b0: 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63  Size & (EP_Reduc
a5c0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
a5d0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  ;.    pNew->flag
a5e0: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
a5f0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
a600: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
a610: 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ring, if any. */
a620: 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20  .    if( nToken 
a630: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
a640: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
a650: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
a660: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
a670: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
a680: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
a690: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
a6a0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d    }..    if( 0==
a6b0: 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d  ((p->flags|pNew-
a6c0: 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f  >flags) & (EP_To
a6d0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a6e0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
a6f0: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
a700: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
a710: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
a720: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
a730: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a740: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
a750: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a760: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
a770: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a780: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
a790: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a7a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a7b0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
a7c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a7d0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
a7e0: 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  st, dupFlags);. 
a7f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a800: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
a810: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
a820: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
a830: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a840: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
a850: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a860: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  nly) ){.      zA
a870: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a880: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a890: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a8a0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a8b0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65  ty(pNew, EP_Toke
a8c0: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a8d0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a8e0: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a8f0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a900: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a910: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a920: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a930: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a940: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a950: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a980: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a990: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a9a0: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a9b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a    }.      if( pz
a9c0: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
a9d0: 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41    *pzBuffer = zA
a9e0: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lloc;.      }.  
a9f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
aa00: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
aa10: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
aa20: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29  |EP_TokenOnly) )
aa30: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
aa40: 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  pWin = 0;.      
aa50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
aa60: 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 77 69 6e 44  New->pWin = winD
aa70: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 6e 29 3b  up(db, p->pWin);
aa80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
aa90: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
aaa0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
aab0: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
aac0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
aad0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
aae0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
aaf0: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
ab00: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
ab10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
ab20: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70  >iColumn==0 || p
ab30: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
ab40: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ab50: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c   p->pRight==0  |
ab60: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e  | p->pRight==p->
ab70: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20  pLeft );.       
ab80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ab90: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
aba0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
abb0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
abc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
abd0: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
abe0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
abf0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
ac00: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ac10: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
ac20: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
ac30: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
ac40: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
ac50: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
ac60: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
ac70: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
ac80: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
ac90: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
aca0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
acb0: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
acc0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
acd0: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
ace0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
acf0: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
ad00: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
ad10: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
ad20: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
ad30: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
ad40: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
ad50: 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28  of(*p) + sizeof(
ad60: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
ad70: 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74  Cte-1);.    pRet
ad80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
ad90: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
ada0: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  );.    if( pRet 
adb0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
adc0: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65        pRet->nCte
add0: 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20   = p->nCte;.    
ade0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
adf0: 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
ae00: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70      pRet->a[i].p
ae10: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
ae20: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
ae30: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30  >a[i].pSelect, 0
ae40: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
ae50: 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71  >a[i].pCols = sq
ae60: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
ae70: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f  (db, p->a[i].pCo
ae80: 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ls, 0);.        
ae90: 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pRet->a[i].zName
aea0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
aeb0: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  up(db, p->a[i].z
aec0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
aed0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
aee0: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
aef0: 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70  # define withDup
af00: 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a  (x,y) 0.#endif..
af10: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
af20: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
af30: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
af40: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
af50: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
af60: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
af70: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
af80: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
af90: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
afa0: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
afb0: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
afc0: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
afd0: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
afe0: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
aff0: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
b000: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
b010: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
b020: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
b030: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
b040: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
b050: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
b060: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
b070: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
b080: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
b090: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
b0a0: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
b0b0: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
b0c0: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
b0d0: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
b0e0: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
b0f0: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
b100: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
b110: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
b120: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
b130: 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
b140: 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74  tains a combinat
b150: 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44  ion of the EXPRD
b160: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
b170: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
b180: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
b190: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  et, then the str
b1a0: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
b1b0: 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65  is a.** truncate
b1c0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
b1d0: 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75   usual Expr stru
b1e0: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
b1f0: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
b200: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
b210: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
b220: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
b230: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  base schema..*/.
b240: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
b250: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
b260: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
b270: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
b280: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
b290: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
b2a0: 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  CE );.  return p
b2b0: 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   ? exprDup(db, p
b2c0: 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b  , flags, 0) : 0;
b2d0: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
b2e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
b2f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
b300: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  rList *p, int fl
b310: 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ags){.  ExprList
b320: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
b330: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
b340: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
b350: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
b360: 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74 43  r *pPriorSelectC
b370: 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ol = 0;.  assert
b380: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
b390: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
b3a0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
b3b0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
b3c0: 64 62 2c 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  db, sqlite3DbMal
b3d0: 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 29 29 3b  locSize(db, p));
b3e0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
b3f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b400: 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45  w->nExpr = p->nE
b410: 78 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  xpr;.  pItem = p
b420: 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74  New->a;.  pOldIt
b430: 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72  em = p->a;.  for
b440: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
b450: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20  ; i++, pItem++, 
b460: 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pOldItem++){.   
b470: 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20   Expr *pOldExpr 
b480: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70  = pOldItem->pExp
b490: 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  r;.    Expr *pNe
b4a0: 77 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d  wExpr;.    pItem
b4b0: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
b4c0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
b4d0: 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20  dExpr, flags);. 
b4e0: 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 20     if( pOldExpr 
b4f0: 0a 20 20 20 20 20 26 26 20 70 4f 6c 64 45 78 70  .     && pOldExp
b500: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
b510: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20  _COLUMN.     && 
b520: 28 70 4e 65 77 45 78 70 72 20 3d 20 70 49 74 65  (pNewExpr = pIte
b530: 6d 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a 20 20  m->pExpr)!=0 .  
b540: 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
b550: 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f  t( pNewExpr->iCo
b560: 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29  lumn==0 || i>0 )
b570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
b580: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30  Expr->iColumn==0
b590: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
b5a0: 72 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c  rt( pOldExpr->pL
b5b0: 65 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70  eft==pOldExpr->p
b5c0: 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20  Right );.       
b5d0: 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c   pPriorSelectCol
b5e0: 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65   = pNewExpr->pLe
b5f0: 66 74 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70  ft = pNewExpr->p
b600: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c  Right;.      }el
b610: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
b620: 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
b630: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
b640: 5b 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  [-1].pExpr!=0 );
b650: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b660: 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75   pNewExpr->iColu
b670: 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45  mn==pItem[-1].pE
b680: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29  xpr->iColumn+1 )
b690: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b6a0: 28 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f  ( pPriorSelectCo
b6b0: 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78  l==pItem[-1].pEx
b6c0: 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20  pr->pLeft );.   
b6d0: 20 20 20 20 20 70 4e 65 77 45 78 70 72 2d 3e 70       pNewExpr->p
b6e0: 4c 65 66 74 20 3d 20 70 50 72 69 6f 72 53 65 6c  Left = pPriorSel
b6f0: 65 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a  ectCol;.      }.
b700: 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d      }.    pItem-
b710: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
b720: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b730: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
b740: 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20     pItem->zSpan 
b750: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b760: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b770: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
b780: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  m->sortOrder = p
b790: 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  OldItem->sortOrd
b7a0: 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64  er;.    pItem->d
b7b0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  one = 0;.    pIt
b7c0: 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  em->bSpanIsTab =
b7d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e   pOldItem->bSpan
b7e0: 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d  IsTab;.    pItem
b7f0: 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 3d 20 70  ->bSorterRef = p
b800: 4f 6c 64 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72  OldItem->bSorter
b810: 52 65 66 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  Ref;.    pItem->
b820: 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b  u = pOldItem->u;
b830: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
b840: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ew;.}../*.** If 
b850: 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72  cursors, trigger
b860: 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  s, views and sub
b870: 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20  queries are all 
b880: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  omitted from.** 
b890: 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  the build, then 
b8a0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  none of the foll
b8b0: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20  owing routines, 
b8c0: 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73  except for .** s
b8d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
b8e0: 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ), can be called
b8f0: 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  . sqlite3SelectD
b900: 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65  up() is sometime
b910: 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68  s.** called with
b920: 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74   a NULL argument
b930: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
b940: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
b950: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
b960: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
b970: 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69  GER) \. || !defi
b980: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b990: 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73  SUBQUERY).SrcLis
b9a0: 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
b9b0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
b9c0: 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e  , SrcList *p, in
b9d0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c  t flags){.  SrcL
b9e0: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
b9f0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   i;.  int nByte;
ba00: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
ba10: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
ba20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79   return 0;.  nBy
ba30: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
ba40: 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73  + (p->nSrc>0 ? s
ba50: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
ba60: 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30   (p->nSrc-1) : 0
ba70: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
ba80: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
ba90: 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
baa0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
bab0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
bac0: 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  nSrc = pNew->nAl
bad0: 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20  loc = p->nSrc;. 
bae0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
baf0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
bb00: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
bb10: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
bb20: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
bb30: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
bb40: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
bb50: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61  &p->a[i];.    Ta
bb60: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
bb70: 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61  NewItem->pSchema
bb80: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63   = pOldItem->pSc
bb90: 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74  hema;.    pNewIt
bba0: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
bbb0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
bbc0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44  db, pOldItem->zD
bbd0: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e  atabase);.    pN
bbe0: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
bbf0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
bc00: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
bc10: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
bc20: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
bc30: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bc40: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61   pOldItem->zAlia
bc50: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
bc60: 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ->fg = pOldItem-
bc70: 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  >fg;.    pNewIte
bc80: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
bc90: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
bca0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64      pNewItem->ad
bcb0: 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64  drFillSub = pOld
bcc0: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
bcd0: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
bce0: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c  >regReturn = pOl
bcf0: 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  dItem->regReturn
bd00: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74  ;.    if( pNewIt
bd10: 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  em->fg.isIndexed
bd20: 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  By ){.      pNew
bd30: 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
bd40: 64 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53  dBy = sqlite3DbS
bd50: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
bd60: 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
bd70: 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  y);.    }.    pN
bd80: 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78  ewItem->pIBIndex
bd90: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42   = pOldItem->pIB
bda0: 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
bdb0: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  NewItem->fg.isTa
bdc0: 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70  bFunc ){.      p
bdd0: 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  NewItem->u1.pFun
bde0: 63 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20  cArg = .        
bdf0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
be00: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
be10: 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20  m->u1.pFuncArg, 
be20: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
be30: 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65    pTab = pNewIte
be40: 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74  m->pTab = pOldIt
be50: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
be60: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
be70: 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b  pTab->nTabRef++;
be80: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
be90: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
bea0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
beb0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  db, pOldItem->pS
bec0: 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20  elect, flags);. 
bed0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
bee0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
bef0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
bf00: 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  pOn, flags);.   
bf10: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e   pNewItem->pUsin
bf20: 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  g = sqlite3IdLis
bf30: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
bf40: 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m->pUsing);.    
bf50: 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pNewItem->colUse
bf60: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f  d = pOldItem->co
bf70: 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74  lUsed;.  }.  ret
bf80: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
bf90: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
bfa0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
bfb0: 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20  , IdList *p){.  
bfc0: 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  IdList *pNew;.  
bfd0: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
bfe0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
bff0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
c000: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
c010: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
c020: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
c030: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
c040: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
c050: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
c060: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
c070: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
c080: 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  awNN(db, p->nId*
c090: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
c0a0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
c0b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
c0c0: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
c0d0: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
c0e0: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74   0;.  }.  /* Not
c0f0: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74  e that because t
c100: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
c110: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d  llocation for p-
c120: 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  >a[] is not.  **
c130: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70   necessarily a p
c140: 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c  ower of two, sql
c150: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
c160: 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61  () may not be ca
c170: 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lled.  ** on the
c180: 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74   duplicate creat
c190: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
c1a0: 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ion. */.  for(i=
c1b0: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
c1c0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
c1d0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
c1e0: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
c1f0: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
c200: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
c210: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
c220: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
c230: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
c240: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
c250: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
c260: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
c270: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
c280: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
c290: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
c2a0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
c2b0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
c2c0: 20 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67   *pDup, int flag
c2d0: 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52  s){.  Select *pR
c2e0: 65 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74  et = 0;.  Select
c2f0: 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53   *pNext = 0;.  S
c300: 65 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52  elect **pp = &pR
c310: 65 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  et;.  Select *p;
c320: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
c330: 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75  0 );.  for(p=pDu
c340: 70 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f  p; p; p=p->pPrio
c350: 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
c360: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
c370: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
c380: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
c390: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
c3a0: 62 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d  break;.    pNew-
c3b0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
c3c0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c3d0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67   p->pEList, flag
c3e0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53  s);.    pNew->pS
c3f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
c400: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  istDup(db, p->pS
c410: 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  rc, flags);.    
c420: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73  pNew->pWhere = s
c430: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
c440: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61  , p->pWhere, fla
c450: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c460: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
c470: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c480: 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c   p->pGroupBy, fl
c490: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c4a0: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
c4b0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
c4c0: 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b  pHaving, flags);
c4d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  .    pNew->pOrde
c4e0: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
c4f0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
c500: 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29  pOrderBy, flags)
c510: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ;.    pNew->op =
c520: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77   p->op;.    pNew
c530: 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b  ->pNext = pNext;
c540: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  .    pNew->pPrio
c550: 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  r = 0;.    pNew-
c560: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
c570: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
c580: 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a  pLimit, flags);.
c590: 20 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74      pNew->iLimit
c5a0: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
c5b0: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  iOffset = 0;.   
c5c0: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
c5d0: 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  = p->selFlags & 
c5e0: 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61  ~SF_UsesEphemera
c5f0: 6c 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  l;.    pNew->add
c600: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d  rOpenEphm[0] = -
c610: 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  1;.    pNew->add
c620: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
c630: 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65  1;.    pNew->nSe
c640: 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65  lectRow = p->nSe
c650: 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65  lectRow;.    pNe
c660: 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44  w->pWith = withD
c670: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29  up(db, p->pWith)
c680: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e  ;.    pNew->pWin
c690: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
c6a0: 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
c6b0: 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65  New, p->zSelName
c6c0: 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 4e 65  );.    *pp = pNe
c6d0: 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70 4e 65  w;.    pp = &pNe
c6e0: 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  w->pPrior;.    p
c6f0: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  Next = pNew;.  }
c700: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
c710: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
c720: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
c730: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
c740: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
c750: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
c760: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
c770: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
c780: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
c790: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
c7a0: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
c7b0: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
c7c0: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
c7d0: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
c7e0: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
c7f0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
c800: 2a 20 54 68 65 20 70 4c 69 73 74 20 61 72 67 75  * The pList argu
c810: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 69 74  ment must be eit
c820: 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 70 6f  her NULL or a po
c830: 69 6e 74 65 72 20 74 6f 20 61 6e 20 45 78 70 72  inter to an Expr
c840: 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  List.** obtained
c850: 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 61   from a prior ca
c860: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ll to sqlite3Exp
c870: 72 4c 69 73 74 41 70 70 65 6e 64 28 29 2e 20 20  rListAppend().  
c880: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
c890: 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20  may not be used 
c8a0: 77 69 74 68 20 61 6e 20 45 78 70 72 4c 69 73 74  with an ExprList
c8b0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
c8c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
c8d0: 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f 6e 3a 20  p()..** Reason: 
c8e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
c8f0: 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 6e  sumes that the n
c900: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69  umber of slots i
c910: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a 2a 2a 20  n pList->a[].** 
c920: 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  is a power of tw
c930: 6f 2e 20 20 54 68 61 74 20 69 73 20 74 72 75 65  o.  That is true
c940: 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72   for sqlite3Expr
c950: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 65 74  ListAppend() ret
c960: 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69 73 20 6e  urns.** but is n
c970: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74  ot necessarily t
c980: 72 75 65 20 66 72 6f 6d 20 74 68 65 20 72 65 74  rue from the ret
c990: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
c9a0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
c9b0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  )..**.** If a me
c9c0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
c9d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
c9e0: 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73  e entire list is
c9f0: 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55   freed and.** NU
ca00: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  LL is returned. 
ca10: 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20   If non-NULL is 
ca20: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69  returned, then i
ca30: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  t is guaranteed.
ca40: 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ** that the new 
ca50: 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73  entry was succes
ca60: 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e  sfully appended.
ca70: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
ca80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
ca90: 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  end(.  Parse *pP
caa0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
cab0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
cac0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
cad0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
cae0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
caf0: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
cb00: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
cb10: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
cb20: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
cb30: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
cb40: 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  ed. Might be NUL
cb50: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  L */.){.  struct
cb60: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
cb70: 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
cb80: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
cb90: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
cba0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
cbb0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
cbc0: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
cbd0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
cbe0: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
cbf0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
cc00: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
cc10: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
cc20: 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d    pList->nExpr =
cc30: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
cc40: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20  (pList->nExpr & 
cc50: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  (pList->nExpr-1)
cc60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  )==0 ){.    Expr
cc70: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
cc80: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
cc90: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
cca0: 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
ccb0: 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 2b   sizeof(*pList)+
ccc0: 28 32 2a 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  (2*pList->nExpr 
ccd0: 2d 20 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73  - 1)*sizeof(pLis
cce0: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
ccf0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
cd00: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
cd10: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
cd20: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
cd30: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
cd40: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
cd50: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
cd60: 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72  etof(struct Expr
cd70: 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29  List_item,zName)
cd80: 3d 3d 73 69 7a 65 6f 66 28 70 49 74 65 6d 2d 3e  ==sizeof(pItem->
cd90: 70 45 78 70 72 29 20 29 3b 0a 20 20 61 73 73 65  pExpr) );.  asse
cda0: 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73 74 72  rt( offsetof(str
cdb0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cdc0: 6d 2c 70 45 78 70 72 29 3d 3d 30 20 29 3b 0a 20  m,pExpr)==0 );. 
cdd0: 20 6d 65 6d 73 65 74 28 26 70 49 74 65 6d 2d 3e   memset(&pItem->
cde0: 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f 66 28 2a  zName,0,sizeof(*
cdf0: 70 49 74 65 6d 29 2d 6f 66 66 73 65 74 6f 66 28  pItem)-offsetof(
ce00: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
ce10: 69 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b 0a 20 20  item,zName));.  
ce20: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
ce30: 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  Expr;.  return p
ce40: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
ce50: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
ce60: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
ce70: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
ce80: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
ce90: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
cea0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
ceb0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
cec0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
ced0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
cee0: 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78  pColumns and pEx
cef0: 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72  pr form a vector
cf00: 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63   assignment whic
cf10: 68 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  h is part of the
cf20: 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f   SET.** clause o
cf30: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
cf40: 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69  ement.  Like thi
cf50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
cf60: 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31  (a,b,c) = (expr1
cf70: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
cf80: 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20   Or:    (a,b,c) 
cf90: 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20  = (SELECT x,y,z 
cfa0: 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  FROM ....).**.**
cfb0: 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f   For each term o
cfc0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73  f the vector ass
cfd0: 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20  ignment, append 
cfe0: 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74  new entries to t
cff0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
d000: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e   list pList.  In
d010: 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73   the case of a s
d020: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 52  ubquery on the R
d030: 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b  HS, append.** TK
d040: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65  _SELECT_COLUMN e
d050: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45  xpressions..*/.E
d060: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
d070: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65  ExprListAppendVe
d080: 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ctor(.  Parse *p
d090: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
d0a0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d0b0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
d0c0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  *pList,       /*
d0d0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
d0e0: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
d0f0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c  be NULL */.  IdL
d100: 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20  ist *pColumns,  
d110: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e      /* List of n
d120: 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74  ames of LHS of t
d130: 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f  he assignment */
d140: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
d150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63            /* Vec
d160: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74  tor expression t
d170: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
d180: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
d190: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
d1a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
d1b0: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b   int n;.  int i;
d1c0: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
d1d0: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
d1e0: 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70  Expr : 0;.  /* p
d1f0: 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79  Columns can only
d200: 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20   be NULL due to 
d210: 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f  an OOM but an OO
d220: 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a  M will cause an.
d230: 20 20 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20    ** exit prior 
d240: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
d250: 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f  being invoked */
d260: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f  .  if( NEVER(pCo
d270: 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f  lumns==0) ) goto
d280: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
d290: 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70  rror;.  if( pExp
d2a0: 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74  r==0 ) goto vect
d2b0: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
d2c0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48  ..  /* If the RH
d2d0: 53 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 74  S is a vector, t
d2e0: 68 65 6e 20 77 65 20 63 61 6e 20 69 6d 6d 65 64  hen we can immed
d2f0: 69 61 74 65 6c 79 20 63 68 65 63 6b 20 74 6f 20  iately check to 
d300: 73 65 65 20 74 68 61 74 20 0a 20 20 2a 2a 20 74  see that .  ** t
d310: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 52  he size of the R
d320: 48 53 20 61 6e 64 20 4c 48 53 20 6d 61 74 63 68  HS and LHS match
d330: 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 52 48  .  But if the RH
d340: 53 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 0a  S is a SELECT, .
d350: 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 73 20 28    ** wildcards (
d360: 22 2a 22 29 20 69 6e 20 74 68 65 20 72 65 73 75  "*") in the resu
d370: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
d380: 4c 45 43 54 20 6d 75 73 74 20 62 65 20 65 78 70  LECT must be exp
d390: 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 20 20 2a  anded before.  *
d3a0: 2a 20 77 65 20 63 61 6e 20 64 6f 20 74 68 65 20  * we can do the 
d3b0: 73 69 7a 65 20 63 68 65 63 6b 2c 20 73 6f 20 64  size check, so d
d3c0: 65 66 65 72 20 74 68 65 20 73 69 7a 65 20 63 68  efer the size ch
d3d0: 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  eck until code g
d3e0: 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  eneration..  */.
d3f0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
d400: 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 43  =TK_SELECT && pC
d410: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 28 6e 3d  olumns->nId!=(n=
d420: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
d430: 72 53 69 7a 65 28 70 45 78 70 72 29 29 20 29 7b  rSize(pExpr)) ){
d440: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
d450: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
d460: 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65   columns assigne
d470: 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  d %d values",.  
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d490: 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c    pColumns->nId,
d4a0: 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65   n);.    goto ve
d4b0: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
d4c0: 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  r;.  }..  for(i=
d4d0: 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73 2d 3e 6e  0; i<pColumns->n
d4e0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  Id; i++){.    Ex
d4f0: 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20 73  pr *pSubExpr = s
d500: 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63  qlite3ExprForVec
d510: 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c  torField(pParse,
d520: 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20 20   pExpr, i);.    
d530: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
d540: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
d550: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53 75  arse, pList, pSu
d560: 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  bExpr);.    if( 
d570: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61  pList ){.      a
d580: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
d590: 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20  xpr==iFirst+i+1 
d5a0: 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  );.      pList->
d5b0: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
d5c0: 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d  ].zName = pColum
d5d0: 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  ns->a[i].zName;.
d5e0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e        pColumns->
d5f0: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[i].zName = 0;.
d600: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
d610: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
d620: 65 64 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  ed && pExpr->op=
d630: 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 41 4c  =TK_SELECT && AL
d640: 57 41 59 53 28 70 4c 69 73 74 21 3d 30 29 20 29  WAYS(pList!=0) )
d650: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 46 69 72  {.    Expr *pFir
d660: 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 46  st = pList->a[iF
d670: 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20 20 20  irst].pExpr;.   
d680: 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74 21   assert( pFirst!
d690: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d6a0: 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d 54 4b  ( pFirst->op==TK
d6b0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
d6c0: 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53  ;.     .    /* S
d6d0: 74 6f 72 65 20 74 68 65 20 53 45 4c 45 43 54 20  tore the SELECT 
d6e0: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 70 52 69  statement in pRi
d6f0: 67 68 74 20 73 6f 20 69 74 20 77 69 6c 6c 20 62  ght so it will b
d700: 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 0a 20  e deleted when. 
d710: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70     ** sqlite3Exp
d720: 72 4c 69 73 74 44 65 6c 65 74 65 28 29 20 69 73  rListDelete() is
d730: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 70   called */.    p
d740: 46 69 72 73 74 2d 3e 70 52 69 67 68 74 20 3d 20  First->pRight = 
d750: 70 45 78 70 72 3b 0a 20 20 20 20 70 45 78 70 72  pExpr;.    pExpr
d760: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65   = 0;..    /* Re
d770: 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a 65 20  member the size 
d780: 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 69 54  of the LHS in iT
d790: 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77 65 20  able so that we 
d7a0: 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74 0a 20  can check that. 
d7b0: 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 61 6e     ** the RHS an
d7c0: 64 20 4c 48 53 20 73 69 7a 65 73 20 6d 61 74 63  d LHS sizes matc
d7d0: 68 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65  h during code ge
d7e0: 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  neration. */.   
d7f0: 20 70 46 69 72 73 74 2d 3e 69 54 61 62 6c 65 20   pFirst->iTable 
d800: 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b  = pColumns->nId;
d810: 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61 70 70  .  }..vector_app
d820: 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  end_error:.  sql
d830: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
d840: 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c  b, pExpr);.  sql
d850: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
d860: 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a  (db, pColumns);.
d870: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
d880: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
d890: 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20   sort order for 
d8a0: 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
d8b0: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 45 78   on the given Ex
d8c0: 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  prList..*/.void 
d8d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
d8e0: 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78 70 72  etSortOrder(Expr
d8f0: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f  List *p, int iSo
d900: 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66 28 20  rtOrder){.  if( 
d910: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
d920: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
d930: 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20 26  SO_UNDEFINED<0 &
d940: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e  & SQLITE_SO_ASC>
d950: 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f  =0 && SQLITE_SO_
d960: 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73 65  DESC>0 );.  asse
d970: 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29  rt( p->nExpr>0 )
d980: 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64  ;.  if( iSortOrd
d990: 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73 73 65  er<0 ){.    asse
d9a0: 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70  rt( p->a[p->nExp
d9b0: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d  r-1].sortOrder==
d9c0: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b  SQLITE_SO_ASC );
d9d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d9e0: 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  .  p->a[p->nExpr
d9f0: 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  -1].sortOrder = 
da00: 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a  (u8)iSortOrder;.
da10: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
da20: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e   ExprList.a[].zN
da30: 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ame element of t
da40: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
da50: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
da60: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
da70: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
da80: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
da90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
daa0: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e  M error.  But pN
dab0: 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  ame should never
dac0: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
dad0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
dae0: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
daf0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
db00: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
db10: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
db20: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
db30: 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  SetName(.  Parse
db40: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
db50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
db60: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
db70: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
db80: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
db90: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
dba0: 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pan. */.  Token 
dbb0: 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
dbc0: 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20    /* Name to be 
dbd0: 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  added */.  int d
dbe0: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
dbf0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61     /* True to ca
dc00: 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20  use the name to 
dc10: 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29  be dequoted */.)
dc20: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  {.  assert( pLis
dc30: 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  t!=0 || pParse->
dc40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
dc50: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
dc60: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
dc70: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
dc80: 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72  pItem;.    asser
dc90: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
dca0: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
dcb0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
dcc0: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
dcd0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a  assert( pItem->z
dce0: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
dcf0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
dd00: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
dd10: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
dd20: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
dd30: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
dd40: 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65  ) sqlite3Dequote
dd50: 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
dd60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
dd70: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
dd80: 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20  ].zSpan element 
dd90: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
dda0: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
ddb0: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
ddc0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
ddd0: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
dde0: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
ddf0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
de00: 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e  t pSpan should n
de10: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
de20: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
de30: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
de40: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
de50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
de60: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
de70: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
de80: 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50  ListSetSpan(.  P
de90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
dea0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
deb0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
dec0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
ded0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
dee0: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
def0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f  he span. */.  co
df00: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74  nst char *zStart
df10: 2c 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f  ,     /* Start o
df20: 66 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20  f the span */.  
df30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64  const char *zEnd
df40: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
df50: 66 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 29 7b  f the span */.){
df60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
df70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
df80: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
df90: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
dfa0: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
dfb0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
dfc0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
dfd0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
dfe0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
dff0: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
e000: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
e010: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
e020: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
e030: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
e040: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
e050: 74 65 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c  te3DbSpanDup(db,
e060: 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a   zStart, zEnd);.
e070: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
e080: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
e090: 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61  ist pEList conta
e0a0: 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c  ins more than iL
e0b0: 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a  imit elements,.*
e0c0: 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
e0d0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
e0e0: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
e0f0: 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
e100: 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20  Length(.  Parse 
e110: 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c  *pParse,.  ExprL
e120: 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63  ist *pEList,.  c
e130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65  onst char *zObje
e140: 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d  ct.){.  int mx =
e150: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
e160: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
e170: 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74  _COLUMN];.  test
e180: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
e190: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
e1a0: 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  x );.  testcase(
e1b0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
e1c0: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29  t->nExpr==mx+1 )
e1d0: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26  ;.  if( pEList &
e1e0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
e1f0: 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mx ){.    sqlite
e200: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e210: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
e220: 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a  mns in %s", zObj
e230: 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ect);.  }.}../*.
e240: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
e250: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
e260: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ist..*/.static S
e270: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
e280: 6f 69 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65  oid exprListDele
e290: 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62  teNN(sqlite3 *db
e2a0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
e2b0: 74 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4c  t){.  int i = pL
e2c0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 74  ist->nExpr;.  st
e2d0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
e2e0: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c 69  em *pItem =  pLi
e2f0: 73 74 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74 28  st->a;.  assert(
e300: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
e310: 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c  );.  do{.    sql
e320: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
e330: 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  b, pItem->pExpr)
e340: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e350: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e360: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
e370: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
e380: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
e390: 70 49 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c  pItem++;.  }whil
e3a0: 65 28 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73 71  e( --i>0 );.  sq
e3b0: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
e3c0: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64  , pList);.}.void
e3d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e3e0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
e3f0: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
e400: 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ist){.  if( pLis
e410: 74 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65  t ) exprListDele
e420: 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b  teNN(db, pList);
e430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e440: 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20   the bitwise-OR 
e450: 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67  of all Expr.flag
e460: 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  s fields in the 
e470: 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73  given.** ExprLis
e480: 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  t..*/.u32 sqlite
e490: 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63  3ExprListFlags(c
e4a0: 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70  onst ExprList *p
e4b0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
e4c0: 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 61    u32 m = 0;.  a
e4d0: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
e4e0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
e4f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
e500: 2b 29 7b 0a 20 20 20 20 20 45 78 70 72 20 2a 70  +){.     Expr *p
e510: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
e520: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 61  i].pExpr;.     a
e530: 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
e540: 29 3b 0a 20 20 20 20 20 6d 20 7c 3d 20 70 45 78  );.     m |= pEx
e550: 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20  pr->flags;.  }. 
e560: 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a   return m;.}../*
e570: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 53 45  .** This is a SE
e580: 4c 45 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62 61  LECT-node callba
e590: 63 6b 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ck for the expre
e5a0: 73 73 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68 61  ssion walker tha
e5b0: 74 0a 2a 2a 20 61 6c 77 61 79 73 20 22 66 61 69  t.** always "fai
e5c0: 6c 73 22 2e 20 20 42 79 20 22 66 61 69 6c 22 20  ls".  By "fail" 
e5d0: 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 77 65  in this case, we
e5e0: 20 6d 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57 61   mean set.** pWa
e5f0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 7a  lker->eCode to z
e600: 65 72 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a  ero and abort..*
e610: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61  *.** This callba
e620: 63 6b 20 69 73 20 75 73 65 64 20 62 79 20 6d 75  ck is used by mu
e630: 6c 74 69 70 6c 65 20 65 78 70 72 65 73 73 69 6f  ltiple expressio
e640: 6e 20 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e  n walkers..*/.in
e650: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  t sqlite3SelectW
e660: 61 6c 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20 2a  alkFail(Walker *
e670: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
e680: 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
e690: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
e6a0: 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65  tUsed);.  pWalke
e6b0: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
e6c0: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
e6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
e6e0: 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69  e input expressi
e6f0: 6f 6e 20 69 73 20 61 6e 20 49 44 20 77 69 74 68  on is an ID with
e700: 20 74 68 65 20 6e 61 6d 65 20 22 74 72 75 65 22   the name "true"
e710: 20 6f 72 20 22 66 61 6c 73 65 22 0a 2a 2a 20 74   or "false".** t
e720: 68 65 6e 20 63 6f 6e 76 65 72 74 20 69 74 20 69  hen convert it i
e730: 6e 74 6f 20 61 6e 20 54 4b 5f 54 52 55 45 46 41  nto an TK_TRUEFA
e740: 4c 53 45 20 74 65 72 6d 2e 20 20 52 65 74 75 72  LSE term.  Retur
e750: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a  n non-zero if.**
e760: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
e770: 68 61 70 70 65 6e 65 64 2c 20 61 6e 64 20 7a 65  happened, and ze
e780: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
e790: 73 69 6f 6e 20 69 73 20 75 6e 61 6c 74 65 72 65  sion is unaltere
e7a0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
e7b0: 33 45 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c  3ExprIdToTrueFal
e7c0: 73 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  se(Expr *pExpr){
e7d0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e7e0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70  ->op==TK_ID || p
e7f0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  Expr->op==TK_STR
e800: 49 4e 47 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ING );.  if( sql
e810: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
e820: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 74 72  r->u.zToken, "tr
e830: 75 65 22 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 71  ue")==0.   || sq
e840: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78  lite3StrICmp(pEx
e850: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66  pr->u.zToken, "f
e860: 61 6c 73 65 22 29 3d 3d 30 0a 20 20 29 7b 0a 20  alse")==0.  ){. 
e870: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
e880: 4b 5f 54 52 55 45 46 41 4c 53 45 3b 0a 20 20 20  K_TRUEFALSE;.   
e890: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
e8a0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e8b0: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
e8c0: 20 6d 75 73 74 20 62 65 20 61 20 54 4b 5f 54 52   must be a TK_TR
e8d0: 55 45 46 41 4c 53 45 20 45 78 70 72 20 6e 6f 64  UEFALSE Expr nod
e8e0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
e8f0: 69 74 20 69 73 20 54 52 55 45 0a 2a 2a 20 61 6e  it is TRUE.** an
e900: 64 20 30 20 69 66 20 69 74 20 69 73 20 46 41 4c  d 0 if it is FAL
e910: 53 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  SE..*/.int sqlit
e920: 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
e930: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78  (const Expr *pEx
e940: 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  pr){.  assert( p
e950: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55  Expr->op==TK_TRU
e960: 45 46 41 4c 53 45 20 29 3b 0a 20 20 61 73 73 65  EFALSE );.  asse
e970: 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  rt( sqlite3StrIC
e980: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
e990: 65 6e 2c 22 74 72 75 65 22 29 3d 3d 30 0a 20 20  en,"true")==0.  
e9a0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53       || sqlite3S
e9b0: 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
e9c0: 7a 54 6f 6b 65 6e 2c 22 66 61 6c 73 65 22 29 3d  zToken,"false")=
e9d0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
e9e0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34  Expr->u.zToken[4
e9f0: 5d 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ]==0;.}.../*.** 
ea00: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
ea10: 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61  re Walker callba
ea20: 63 6b 73 20 75 73 65 64 20 74 6f 20 63 68 65 63  cks used to chec
ea30: 6b 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f  k expressions to
ea40: 0a 2a 2a 20 73 65 65 20 69 66 20 74 68 65 79 20  .** see if they 
ea50: 61 72 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66  are "constant" f
ea60: 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69  or some definiti
ea70: 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20  on of constant. 
ea80: 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65   The.** Walker.e
ea90: 43 6f 64 65 20 76 61 6c 75 65 20 64 65 74 65 72  Code value deter
eaa0: 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f  mines the type o
eab0: 66 20 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20  f "constant" we 
eac0: 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66  are looking.** f
ead0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  or..**.** These 
eae0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
eaf0: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d  s are used to im
eb00: 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c  plement the foll
eb10: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
eb20: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
eb30: 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20  nstant()        
eb40: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
eb50: 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20  r->eCode==1.**  
eb60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
eb70: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
eb80: 29 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c  )           pWal
eb90: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a  ker->eCode==2.**
eba0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ebb0: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
ebc0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57  )             pW
ebd0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a  alker->eCode==3.
ebe0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
ebf0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
ec00: 6e 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20  nction()        
ec10: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
ec20: 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20  4 or 5.**.** In 
ec30: 61 6c 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63  all cases, the c
ec40: 61 6c 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c  allbacks set Wal
ec50: 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20  ker.eCode=0 and 
ec60: 61 62 6f 72 74 20 69 66 20 74 68 65 20 65 78 70  abort if the exp
ec70: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f  ression.** is fo
ec80: 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20  und to not be a 
ec90: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  constant..**.** 
eca0: 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 49  The sqlite3ExprI
ecb0: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
ecc0: 69 6f 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f  ion() is used fo
ecd0: 72 20 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70  r evaluating exp
ece0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61  ressions.** in a
ecf0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
ed00: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61  atement.  The Wa
ed10: 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65  lker.eCode value
ed20: 20 69 73 20 35 20 77 68 65 6e 20 70 61 72 73 69   is 5 when parsi
ed30: 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e  ng.** an existin
ed40: 67 20 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77  g schema and 4 w
ed50: 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  hen processing a
ed60: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20   new statement. 
ed70: 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61   A bound.** para
ed80: 6d 65 74 65 72 20 72 61 69 73 65 73 20 61 6e 20  meter raises an 
ed90: 65 72 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74  error for new st
eda0: 61 74 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73  atements, but is
edb0: 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72   silently conver
edc0: 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66  ted.** to NULL f
edd0: 6f 72 20 65 78 69 73 74 69 6e 67 20 73 63 68 65  or existing sche
ede0: 6d 61 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77  mas.  This allow
edf0: 73 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  s sqlite_master 
ee00: 74 61 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20  tables that .** 
ee10: 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20  contain a bound 
ee20: 70 61 72 61 6d 65 74 65 72 20 62 65 63 61 75 73  parameter becaus
ee30: 65 20 74 68 65 79 20 77 65 72 65 20 67 65 6e 65  e they were gene
ee40: 72 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76  rated by older v
ee50: 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
ee60: 4c 69 74 65 20 74 6f 20 62 65 20 70 61 72 73 65  Lite to be parse
ee70: 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69  d by newer versi
ee80: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69  ons of SQLite wi
ee90: 74 68 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a  thout raising a.
eea0: 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68  ** malformed sch
eeb0: 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74  ema error..*/.st
eec0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
eed0: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
eee0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
eef0: 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a  r *pExpr){..  /*
ef00: 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f   If pWalker->eCo
ef10: 64 65 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79  de is 2 then any
ef20: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70   term of the exp
ef30: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d  ression that com
ef40: 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  es from.  ** the
ef50: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
ef60: 75 73 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a  uses of a left j
ef70: 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73  oin disqualifies
ef80: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
ef90: 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20    ** from being 
efa0: 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74  considered const
efb0: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57  ant. */.  if( pW
efc0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20  alker->eCode==2 
efd0: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
efe0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
eff0: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57  mJoin) ){.    pW
f000: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
f010: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
f020: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73  _Abort;.  }..  s
f030: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
f040: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
f050: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
f060: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
f070: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
f080: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
f090: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68  .    ** and eith
f0a0: 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  er pWalker->eCod
f0b0: 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65  e==4 or 5 or the
f0c0: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68   function has th
f0d0: 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  e.    ** SQLITE_
f0e0: 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e  FUNC_CONST flag.
f0f0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
f100: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
f110: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
f120: 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73  de>=4 || ExprHas
f130: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45  Property(pExpr,E
f140: 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a  P_ConstFunc) ){.
f150: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
f160: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
f170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f180: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
f190: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
f1a0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
f1b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65        }.    case
f1c0: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 20 20 2f 2a   TK_ID:.      /*
f1d0: 20 43 6f 6e 76 65 72 74 20 22 74 72 75 65 22 20   Convert "true" 
f1e0: 6f 72 20 22 66 61 6c 73 65 22 20 69 6e 20 61 20  or "false" in a 
f1f0: 44 45 46 41 55 4c 54 20 63 6c 61 75 73 65 20 69  DEFAULT clause i
f200: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  nto the.      **
f210: 20 61 70 70 72 6f 70 72 69 61 74 65 20 54 4b 5f   appropriate TK_
f220: 54 52 55 45 46 41 4c 53 45 20 6f 70 65 72 61 74  TRUEFALSE operat
f230: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  or */.      if( 
f240: 73 71 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54  sqlite3ExprIdToT
f250: 72 75 65 46 61 6c 73 65 28 70 45 78 70 72 29 20  rueFalse(pExpr) 
f260: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f270: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
f280: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
f290: 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
f2a0: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
f2b0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
f2c0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
f2d0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
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: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
f310: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
f320: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
f330: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
f340: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
f350: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
f360: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
f370: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
f380: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  UMN );.      if(
f390: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f3a0: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
f3b0: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
f3c0: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
f3d0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
f3e0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
f3f0: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
f400: 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
f410: 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a 20  K_IF_NULL_ROW:. 
f420: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
f430: 54 45 52 3a 0a 20 20 20 20 20 20 74 65 73 74 63  TER:.      testc
f440: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
f450: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
f460: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
f470: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f  Expr->op==TK_IF_
f480: 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20 20  NULL_ROW );.    
f490: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
f4a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
f4b0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
f4c0: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
f4d0: 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  LE:.      if( pW
f4e0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20  alker->eCode==5 
f4f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ){.        /* Si
f500: 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62  lently convert b
f510: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20  ound parameters 
f520: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 73 69  that appear insi
f530: 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20  de of CREATE.   
f540: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
f550: 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77  ts into a NULL w
f560: 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20  hen parsing the 
f570: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
f580: 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20   text out.      
f590: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69    ** of the sqli
f5a0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
f5b0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  */.        pExpr
f5c0: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
f5d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f5e0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
f5f0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
f600: 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  A bound paramete
f610: 72 20 69 6e 20 61 20 43 52 45 41 54 45 20 73 74  r in a CREATE st
f620: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69  atement that ori
f630: 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20  ginates from.   
f640: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
f650: 70 72 65 70 61 72 65 28 29 20 63 61 75 73 65 73  prepare() causes
f660: 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
f670: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f680: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
f690: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
f6a0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
f6b0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
f6c0: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
f6d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f6e0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
f6f0: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71 6c 69  ELECT ); /* sqli
f700: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
f710: 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f  l() disallows */
f720: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f730: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
f740: 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 71 6c 69  XISTS ); /* sqli
f750: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
f760: 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f  l() disallows */
f770: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
f780: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
f790: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
f7a0: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
f7b0: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
f7c0: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
f7d0: 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65  ker w;.  w.eCode
f7e0: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
f7f0: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
f800: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
f810: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
f820: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
f830: 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
f840: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f850: 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63  DEBUG.  w.xSelec
f860: 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c  tCallback2 = sql
f870: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73  ite3SelectWalkAs
f880: 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20  sert2;.#endif.  
f890: 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  w.u.iCur = iCur;
f8a0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
f8b0: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
f8c0: 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
f8d0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
f8e0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
f8f0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
f900: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
f910: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
f920: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76   and 0 if it inv
f930: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
f940: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
f950: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
f960: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
f970: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
f980: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
f990: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
f9a0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
f9b0: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
f9c0: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
f9d0: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
f9e0: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
f9f0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
fa00: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
fa10: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
fa20: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
fa30: 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  p, 1, 0);.}../*.
fa40: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
fa50: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
fa60: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
fa70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
fa80: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
fa90: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
faa0: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
fab0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
fac0: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
fad0: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
fae0: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
faf0: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
fb00: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
fb10: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
fb20: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
fb30: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
fb40: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
fb50: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
fb60: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
fb70: 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 2, 0);.}../*.*
fb80: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
fb90: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
fba0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
fbb0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
fbc0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
fbd0: 20 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20   any single row 
fbe0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  of the table wit
fbf0: 68 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20  h cursor iCur.  
fc00: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
fc10: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
fc20: 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72  n must not refer
fc30: 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65   to any non-dete
fc40: 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69  rministic functi
fc50: 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61  on nor any.** ta
fc60: 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69  ble other than i
fc70: 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Cur..*/.int sqli
fc80: 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
fc90: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20  nstant(Expr *p, 
fca0: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74  int iCur){.  ret
fcb0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
fcc0: 70 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a  p, 3, iCur);.}..
fcd0: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61  ./*.** sqlite3Wa
fce0: 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63  lkExpr() callbac
fcf0: 6b 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65  k used by sqlite
fd00: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
fd10: 72 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73  rGroupBy()..*/.s
fd20: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
fd30: 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  deIsConstantOrGr
fd40: 6f 75 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57  oupBy(Walker *pW
fd50: 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
fd60: 70 72 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  pr){.  ExprList 
fd70: 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c  *pGroupBy = pWal
fd80: 6b 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b  ker->u.pGroupBy;
fd90: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
fda0: 43 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69  Check if pExpr i
fdb0: 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61  s identical to a
fdc0: 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  ny GROUP BY term
fdd0: 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65  . If so, conside
fde0: 72 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61  r.  ** it consta
fdf0: 6e 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  nt.  */.  for(i=
fe00: 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
fe10: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
fe20: 45 78 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70  Expr *p = pGroup
fe30: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
fe40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
fe50: 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45  xprCompare(0, pE
fe60: 78 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b  xpr, p, -1)<2 ){
fe70: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
fe80: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
fe90: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61  xprNNCollSeq(pWa
fea0: 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 29  lker->pParse, p)
feb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
fec0: 74 65 33 5f 73 74 72 69 63 6d 70 28 22 42 49 4e  te3_stricmp("BIN
fed0: 41 52 59 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  ARY", pColl->zNa
fee0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
fef0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
ff00: 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
ff10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
ff20: 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  k if pExpr is a 
ff30: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 66 20 73  sub-select. If s
ff40: 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69 74 20 76  o, consider it v
ff50: 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66  ariable. */.  if
ff60: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
ff70: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
ff80: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 57  elect) ){.    pW
ff90: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
ffa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
ffb0: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72  _Abort;.  }..  r
ffc0: 65 74 75 72 6e 20 65 78 70 72 4e 6f 64 65 49 73  eturn exprNodeIs
ffd0: 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b 65 72  Constant(pWalker
ffe0: 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
fff0: 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65 78 70 72  ** Walk the expr
10000 65 73 73 69 6f 6e 20 74 72 65 65 20 70 61 73 73  ession tree pass
10010 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
10020 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e  argument. Return
10030 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 66 20   non-zero.** if 
10040 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
10050 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
10060 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 6f 72   of constants or
10070 20 63 6f 70 69 65 73 20 6f 66 20 74 65 72 6d 73   copies of terms
10080 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70 42 79   .** in pGroupBy
10090 20 74 68 61 74 20 73 6f 72 74 20 77 69 74 68 20   that sort with 
100a0 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  the BINARY colla
100b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a  tion sequence..*
100c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
100d0 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
100e0 65 72 6d 69 6e 65 20 69 66 20 61 20 74 65 72 6d  ermine if a term
100f0 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63   of the HAVING c
10100 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62 65 20  lause can.** be 
10110 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20 74 68  promoted into th
10120 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
10130 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 73 75   In order for su
10140 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e 20 74  ch a promotion t
10150 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65 20 76  o work,.** the v
10160 61 6c 75 65 20 6f 66 20 74 68 65 20 48 41 56 49  alue of the HAVI
10170 4e 47 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6d  NG clause term m
10180 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
10190 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  for all members 
101a0 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70 22 2e  of.** a "group".
101b0 20 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e    The requiremen
101c0 74 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50  t that the GROUP
101d0 20 42 59 20 74 65 72 6d 20 6d 75 73 74 20 62 65   BY term must be
101e0 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73 75 6d   BINARY.** assum
101f0 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
10200 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10210 6e 63 65 20 77 69 6c 6c 20 68 61 76 65 20 61 20  nce will have a 
10220 66 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a 2a 2a  finer-grained.**
10230 20 67 72 6f 75 70 69 6e 67 20 74 68 61 6e 20 62   grouping than b
10240 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  inary.  In other
10250 20 77 6f 72 64 73 20 28 41 3d 42 20 43 4f 4c 4c   words (A=B COLL
10260 41 54 45 20 62 69 6e 61 72 79 29 20 69 6d 70 6c  ATE binary) impl
10270 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20 65 76  ies.** A=B in ev
10280 65 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74  ery other collat
10290 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 54  ing sequence.  T
102a0 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74  he requirement t
102b0 68 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50  hat the.** GROUP
102c0 20 42 59 20 62 65 20 42 49 4e 41 52 59 20 69 73   BY be BINARY is
102d0 20 73 74 72 69 63 74 65 72 20 74 68 61 6e 20 6e   stricter than n
102e0 65 63 65 73 73 61 72 79 2e 20 20 49 74 20 77 6f  ecessary.  It wo
102f0 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a 2a 2a  uld also work.**
10300 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41 56 49   to promote HAVI
10310 4e 47 20 63 6c 61 75 73 65 73 20 74 68 61 74 20  NG clauses that 
10320 75 73 65 20 74 68 65 20 73 61 6d 65 20 61 6c 74  use the same alt
10330 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
10340 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 61  ng.** sequence a
10350 73 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  s the GROUP BY t
10360 65 72 6d 2c 20 62 75 74 20 74 68 61 74 20 69 73  erm, but that is
10370 20 6d 75 63 68 20 68 61 72 64 65 72 20 74 6f 20   much harder to 
10380 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65 72 6e  check,.** altern
10390 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
103a0 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 75 6e  sequences are un
103b0 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73  common, and this
103c0 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a 20 6f   is only an.** o
103d0 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73 6f 20  ptimization, so 
103e0 77 65 20 74 61 6b 65 20 74 68 65 20 65 61 73 79  we take the easy
103f0 20 77 61 79 20 6f 75 74 20 61 6e 64 20 73 69 6d   way out and sim
10400 70 6c 79 20 72 65 71 75 69 72 65 20 74 68 65 0a  ply require the.
10410 2a 2a 20 47 52 4f 55 50 20 42 59 20 74 6f 20 75  ** GROUP BY to u
10420 73 65 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f  se the BINARY co
10430 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10440 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10450 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
10460 47 72 6f 75 70 42 79 28 50 61 72 73 65 20 2a 70  GroupBy(Parse *p
10470 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20  Parse, Expr *p, 
10480 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
10490 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  By){.  Walker w;
104a0 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a  .  w.eCode = 1;.
104b0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
104c0 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
104d0 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 3b  nstantOrGroupBy;
104e0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
104f0 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  back = 0;.  w.u.
10500 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
10510 70 42 79 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  pBy;.  w.pParse 
10520 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
10530 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
10540 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
10550 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
10560 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
10570 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
10580 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
10590 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
105a0 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
105b0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
105c0 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
105d0 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
105e0 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
105f0 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
10600 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
10610 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
10620 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
10630 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
10640 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
10650 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
10660 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
10670 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
10680 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
10690 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
106a0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
106b0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
106c0 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
106d0 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a  *p, u8 isInit){.
106e0 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74    assert( isInit
106f0 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31  ==0 || isInit==1
10700 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70   );.  return exp
10710 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73  rIsConst(p, 4+is
10720 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  Init, 0);.}..#if
10730 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10740 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f  E_CURSOR_HINTS./
10750 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
10760 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
10770 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
10780 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
10790 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79  ns a.** subquery
107a0 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
107b0 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
107c0 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72  e are no subquer
107d0 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ies..*/.int sqli
107e0 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53  te3ExprContainsS
107f0 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70 29  ubquery(Expr *p)
10800 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
10810 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77  w.eCode = 1;.  w
10820 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
10830 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
10840 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Noop;.  w.xSelec
10850 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
10860 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
10870 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  l;.#ifdef SQLITE
10880 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65  _DEBUG.  w.xSele
10890 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71  ctCallback2 = sq
108a0 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41  lite3SelectWalkA
108b0 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20  ssert2;.#endif. 
108c0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
108d0 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
108e0 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a  n w.eCode==0;.}.
108f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
10900 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10910 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61  p codes a consta
10920 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  nt integer that 
10930 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a  is small enough.
10940 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33  ** to fit in a 3
10950 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
10960 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20  eturn 1 and put 
10970 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
10980 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a   integer.** in *
10990 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20  pValue.  If the 
109a0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
109b0 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  t an integer or 
109c0 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67  if it is too big
109d0 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
109e0 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
109f0 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20  teger, return 0 
10a00 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75  and leave *pValu
10a10 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
10a20 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10a30 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70  sInteger(Expr *p
10a40 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a  , int *pValue){.
10a50 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
10a60 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
10a70 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c  n 0;  /* Can onl
10a80 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f 77 69  y happen followi
10a90 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20 20  ng on OOM */..  
10aa0 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73  /* If an express
10ab0 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ion is an intege
10ac0 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66  r literal that f
10ad0 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20  its in a signed 
10ae0 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65  32-bit.  ** inte
10af0 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50  ger, then the EP
10b00 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77  _IntValue flag w
10b10 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
10b20 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61   been set */.  a
10b30 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
10b40 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e  _INTEGER || (p->
10b50 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
10b60 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20  lue)!=0.        
10b70 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74     || sqlite3Get
10b80 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65  Int32(p->u.zToke
10b90 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20  n, &rc)==0 );.. 
10ba0 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
10bb0 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
10bc0 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e     *pValue = p->
10bd0 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65  u.iValue;.    re
10be0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77  turn 1;.  }.  sw
10bf0 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
10c00 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
10c10 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  : {.      rc = s
10c20 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
10c30 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56  ger(p->pLeft, pV
10c40 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alue);.      bre
10c50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10c60 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
10c70 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20        int v;.   
10c80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
10c90 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
10ca0 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20  Left, &v) ){.   
10cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d       assert( v!=
10cc0 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20  (-2147483647-1) 
10cd0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c  );.        *pVal
10ce0 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20  ue = -v;.       
10cf0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
10d00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10d10 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
10d20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
10d30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10d40 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
10d50 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
10d60 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78  ance that the ex
10d70 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
10d80 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  NULL..**.** If t
10d90 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
10da0 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69  ght be NULL or i
10db0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10dc0 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a   is too complex.
10dd0 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72  ** to tell retur
10de0 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20  n TRUE.  .**.** 
10df0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10e00 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d  used as an optim
10e10 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70  ization, to skip
10e20 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64   OP_IsNull opcod
10e30 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e  es.** when we kn
10e40 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20  ow that a value 
10e50 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20  cannot be NULL. 
10e60 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20   Hence, a false 
10e70 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74  positive.** (ret
10e80 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e  urning TRUE when
10e90 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70   in fact the exp
10ea0 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65  ression can neve
10eb0 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74  r be NULL) might
10ec0 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70  .** be a small p
10ed0 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62  erformance hit b
10ee0 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
10ef0 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68  harmless.  On th
10f00 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c  e other.** hand,
10f10 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   a false negativ
10f20 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c  e (returning FAL
10f30 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  SE when the resu
10f40 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c  lt could be NULL
10f50 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ).** will likely
10f60 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
10f70 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20  correct answer. 
10f80 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62   So when in doub
10f90 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55  t, return.** TRU
10fa0 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
10fb0 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63  3ExprCanBeNull(c
10fc0 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20  onst Expr *p){. 
10fd0 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28   u8 op;.  while(
10fe0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
10ff0 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
11000 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
11010 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
11020 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
11030 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
11040 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
11050 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
11060 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a  ase TK_INTEGER:.
11070 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
11080 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NG:.    case TK_
11090 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
110a0 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  TK_BLOB:.      r
110b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73  eturn 0;.    cas
110c0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
110d0 20 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61     return ExprHa
110e0 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
110f0 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20  CanBeNull) ||.  
11100 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 54             p->pT
11110 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20 52 65 66  ab==0 ||  /* Ref
11120 65 72 65 6e 63 65 20 74 6f 20 63 6f 6c 75 6d 6e  erence to column
11130 20 6f 66 20 69 6e 64 65 78 20 6f 6e 20 65 78 70   of index on exp
11140 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
11150 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c          (p->iCol
11160 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61  umn>=0 && p->pTa
11170 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75  b->aCol[p->iColu
11180 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b  mn].notNull==0);
11190 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
111a0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
111b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
111c0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
111d0 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
111e0 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69  s a constant whi
111f0 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75  ch would be.** u
11200 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41  nchanged by OP_A
11210 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65  ffinity with the
11220 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20   affinity given 
11230 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  in the second.**
11240 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
11250 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
11260 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
11270 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66  ne if the OP_Aff
11280 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a  inity operation.
11290 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
112a0 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  d.  When in doub
112b0 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20  t return FALSE. 
112c0 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   A false negativ
112d0 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73  e.** is harmless
112e0 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
112f0 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61  ive, however, ca
11300 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  n result in the 
11310 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e  wrong.** answer.
11320 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
11330 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
11340 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45  tyChange(const E
11350 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66  xpr *p, char aff
11360 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66  ){.  u8 op;.  if
11370 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ( aff==SQLITE_AF
11380 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20  F_BLOB ) return 
11390 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  1;.  while( p->o
113a0 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
113b0 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
113c0 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
113d0 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
113e0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
113f0 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
11400 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
11410 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
11420 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
11430 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
11440 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
11450 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
11460 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
11470 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11480 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
11490 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
114a0 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66  E_AFF_REAL || af
114b0 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
114c0 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
114d0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
114e0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
114f0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11500 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TEXT;.    }.    
11510 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
11520 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
11530 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11540 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
11550 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61    assert( p->iTa
11560 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20  ble>=0 );  /* p 
11570 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f  cannot be part o
11580 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  f a CHECK constr
11590 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  aint */.      re
115a0 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c  turn p->iColumn<
115b0 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
115c0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
115d0 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
115e0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
115f0 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  IC);.    }.    d
11600 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
11610 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
11620 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
11630 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
11640 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
11650 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
11660 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
11670 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
11680 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
11690 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
116a0 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
116b0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
116c0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
116d0 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
116e0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
116f0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
11700 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
11710 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
11720 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
11730 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f   pX is the RHS o
11740 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
11750 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45  .  If pX is a SE
11760 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a  LECT statement .
11770 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ** that can be s
11780 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64  implified to a d
11790 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65  irect table acce
117a0 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ss, then return.
117b0 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
117c0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
117d0 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20  ment.  If pX is 
117e0 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61  not a SELECT sta
117f0 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66  tement,.** or if
11800 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
11810 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62  ement needs to b
11820 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74  e manifested int
11830 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a  o a transient.**
11840 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74   table, then ret
11850 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66  urn NULL..*/.#if
11860 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11870 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63  _SUBQUERY.static
11880 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69   Select *isCandi
11890 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70  dateForInOpt(Exp
118a0 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74  r *pX){.  Select
118b0 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *p;.  SrcList *
118c0 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74  pSrc;.  ExprList
118d0 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c   *pEList;.  Tabl
118e0 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
118f0 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
11900 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
11910 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74  xIsSelect) ) ret
11920 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61  urn 0;  /* Not a
11930 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
11940 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
11950 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c  ty(pX, EP_VarSel
11960 65 63 74 29 20 20 29 20 72 65 74 75 72 6e 20 30  ect)  ) return 0
11970 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64  ;  /* Correlated
11980 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70   subq */.  p = p
11990 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  X->x.pSelect;.  
119a0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
119b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
119c0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20         /* Not a 
119d0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
119e0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
119f0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
11a00 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
11a10 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  ) ){.    testcas
11a20 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
11a30 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
11a40 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
11a50 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
11a60 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
11a70 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
11a80 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
11a90 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
11aa0 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75  gate );.    retu
11ab0 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54  rn 0; /* No DIST
11ac0 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64  INCT keyword and
11ad0 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
11ae0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20  nctions */.  }. 
11af0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
11b00 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20  upBy==0 );      
11b10 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
11b20 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
11b30 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c  e */.  if( p->pL
11b40 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
11b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b60 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c   Has no LIMIT cl
11b70 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
11b80 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
11b90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11ba0 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45   /* Has no WHERE
11bb0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72   clause */.  pSr
11bc0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
11bd0 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
11be0 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53  ;.  if( pSrc->nS
11bf0 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
11c00 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
11c10 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f  ngle term in FRO
11c20 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  M clause */.  if
11c30 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ( pSrc->a[0].pSe
11c40 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
11c50 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20       /* FROM is 
11c60 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f  not a subquery o
11c70 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62  r view */.  pTab
11c80 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54   = pSrc->a[0].pT
11c90 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ab;.  assert( pT
11ca0 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab!=0 );.  asser
11cb0 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  t( pTab->pSelect
11cc0 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
11cd0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
11ce0 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a   is not a view *
11cf0 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
11d00 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
11d10 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52   0;        /* FR
11d20 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20  OM clause not a 
11d30 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
11d40 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
11d50 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28  EList;.  assert(
11d60 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
11d70 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65  /* All SELECT re
11d80 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f  sults must be co
11d90 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28  lumns. */.  for(
11da0 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
11db0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
11dc0 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c  Expr *pRes = pEL
11dd0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
11de0 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f  .    if( pRes->o
11df0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
11e00 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73  eturn 0;.    ass
11e10 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c  ert( pRes->iTabl
11e20 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43  e==pSrc->a[0].iC
11e30 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74  ursor );  /* Not
11e40 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
11e50 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20  bquery */.  }.  
11e60 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64  return p;.}.#end
11e70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11e80 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
11e90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11ea0 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
11eb0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
11ec0 74 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20  that checks the 
11ed0 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
11ee0 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20   of index table 
11ef0 69 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a  iCur to see if.*
11f00 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  * it contains an
11f10 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20  y NULL entries. 
11f20 20 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73   Cause the regis
11f30 74 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c  ter at regHasNul
11f40 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74  l to be set.** t
11f50 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  o a non-NULL val
11f60 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  ue if iCur conta
11f70 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43  ins no NULLs.  C
11f80 61 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65  ause register re
11f90 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62  gHasNull.** to b
11fa0 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  e set to NULL if
11fb0 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f   iCur contains o
11fc0 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
11fd0 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  values..*/.stati
11fe0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
11ff0 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62  tHasNullFlag(Vdb
12000 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20  e *v, int iCur, 
12010 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b  int regHasNull){
12020 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20  .  int addr1;.  
12030 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12040 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
12050 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b   0, regHasNull);
12060 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
12070 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12080 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29  OP_Rewind, iCur)
12090 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
120a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
120b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
120c0 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65  umn, iCur, 0, re
120d0 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c  gHasNull);.  sql
120e0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
120f0 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  (v, OPFLAG_TYPEO
12100 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d  FARG);.  VdbeCom
12110 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f  ment((v, "first_
12120 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69  entry_in(%d)", i
12130 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cur));.  sqlite3
12140 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12150 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66  addr1);.}.#endif
12160 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
12170 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
12180 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
12190 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  nt is an IN oper
121a0 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74  ator with a list
121b0 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79   (not a subquery
121c0 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67  ) on the .** rig
121d0 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52  ht-hand side.  R
121e0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
121f0 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74  at list is const
12200 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ant..*/.static i
12210 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49  nt sqlite3InRhsI
12220 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
12230 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c  pIn){.  Expr *pL
12240 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  HS;.  int res;. 
12250 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
12260 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45  sProperty(pIn, E
12270 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
12280 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c    pLHS = pIn->pL
12290 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66  eft;.  pIn->pLef
122a0 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73  t = 0;.  res = s
122b0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
122c0 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e  tant(pIn);.  pIn
122d0 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a  ->pLeft = pLHS;.
122e0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
122f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
12300 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
12310 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
12320 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
12330 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
12340 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61  or..** The pX pa
12350 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
12360 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65  xpression on the
12370 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
12380 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a  perator, which.*
12390 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65  * might be eithe
123a0 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  r a list of expr
123b0 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62  essions or a sub
123c0 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
123d0 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
123e0 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20  tine is to find 
123f0 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72  or create a b-tr
12400 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63  ee object that c
12410 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69  an.** be used ei
12420 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72  ther to test for
12430 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74   membership in t
12440 68 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f  he RHS set or to
12450 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
12460 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  .** all members 
12470 6f 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20  of the RHS set, 
12480 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61  skipping duplica
12490 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72  tes..**.** A cur
124a0 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  sor is opened on
124b0 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
124c0 63 74 20 74 68 61 74 20 69 73 20 74 68 65 20 52  ct that is the R
124d0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
124e0 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d  rator.** and pX-
124f0 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  >iTable is set t
12500 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
12510 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  hat cursor..**.*
12520 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
12530 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
12540 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20  ction indicates 
12550 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c  the b-tree type,
12560 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
12570 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
12580 57 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63  WID      - The c
12590 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
125a0 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
125b0 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
125c0 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d  DEX_INDEX_ASC  -
125d0 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
125e0 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63  opened on an asc
125f0 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a  ending index..**
12600 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
12610 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72  X_DESC - The cur
12620 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
12630 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
12640 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  ndex..**   IN_IN
12650 44 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d  DEX_EPH        -
12660 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
12670 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63  opened on a spec
12680 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e  ially created an
12690 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70               pop
126b0 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c  ulated epheremal
126c0 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
126d0 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20  INDEX_NOOP      
126e0 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73   - No cursor was
126f0 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65   allocated.  The
12700 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73   IN operator mus
12710 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  t be.**         
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
12740 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d   sequence of com
12750 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  parisons..**.** 
12760 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72  An existing b-tr
12770 65 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  ee might be used
12780 20 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72   if the RHS expr
12790 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73  ession pX is a s
127a0 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72  imple.** subquer
127b0 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a  y such as:.**.**
127c0 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
127d0 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e  umn1>, <column2>
127e0 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e  ... FROM <table>
127f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48  .**.** If the RH
12800 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
12810 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f  ator is a list o
12820 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  r a more complex
12830 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a   subquery, then.
12840 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ** an ephemeral 
12850 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64  table might need
12860 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
12870 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e   from the RHS an
12880 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54  d then.** pX->iT
12890 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69  able made to poi
128a0 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65  nt to the epheme
128b0 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61  ral table instea
128c0 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74  d of an.** exist
128d0 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ing table..**.**
128e0 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72   The inFlags par
128f0 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74  ameter must cont
12900 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69 6d 75  ain, at a minimu
12910 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69  m, one of the bi
12920 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ts.** IN_INDEX_M
12930 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f  EMBERSHIP or IN_
12940 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74 20 6e  INDEX_LOOP but n
12950 6f 74 20 62 6f 74 68 2e 20 20 49 66 20 69 6e 46  ot both.  If inF
12960 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  lags contains.**
12970 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
12980 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20 67  SHIP, then the g
12990 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20 77  enerated table w
129a0 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
129b0 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62 65 72  a fast.** member
129c0 73 68 69 70 20 74 65 73 74 2e 20 20 57 68 65 6e  ship test.  When
129d0 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f   the IN_INDEX_LO
129e0 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c 20 74  OP bit is set, t
129f0 68 65 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c  he IN index will
12a00 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 6c  .** be used to l
12a10 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  oop over all val
12a20 75 65 73 20 6f 66 20 74 68 65 20 52 48 53 20 6f  ues of the RHS o
12a30 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
12a40 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e  r..**.** When IN
12a50 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75  _INDEX_LOOP is u
12a60 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74  sed (and the b-t
12a70 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
12a80 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74   to iterate.** t
12a90 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d  hrough the set m
12aa0 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65  embers) then the
12ab0 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74   b-tree must not
12ac0 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61   contain duplica
12ad0 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72  tes..** An epher
12ae0 65 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  emal table will 
12af0 62 65 20 63 72 65 61 74 65 64 20 75 6e 6c 65 73  be created unles
12b00 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63  s the selected c
12b10 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72 61  olumns are guara
12b20 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75  nteed.** to be u
12b30 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62  nique - either b
12b40 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20  ecause it is an 
12b50 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
12b60 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a  KEY or due to.**
12b70 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72   a UNIQUE constr
12b80 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a  aint or index..*
12b90 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44  *.** When IN_IND
12ba0 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73  EX_MEMBERSHIP is
12bb0 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62   used (and the b
12bc0 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
12bd0 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20  ed .** for fast 
12be0 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
12bf0 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70  ests) then an ep
12c00 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
12c10 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75  st .** be used u
12c20 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20  nless <columns> 
12c30 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54 45  is a single INTE
12c40 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
12c50 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a  column or an .**
12c60 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66 6f   index can be fo
12c70 75 6e 64 20 77 69 74 68 20 74 68 65 20 73 70 65  und with the spe
12c80 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e  cified <columns>
12c90 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73   as its left-mos
12ca0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
12cb0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
12cc0 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45   and IN_INDEX_ME
12cd0 4d 42 45 52 53 48 49 50 20 61 72 65 20 62 6f 74  MBERSHIP are bot
12ce0 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20  h set and.** if 
12cf0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12d00 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
12d10 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71  list (not a subq
12d20 75 65 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a  uery) then this.
12d30 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  ** routine might
12d40 20 64 65 63 69 64 65 20 74 68 61 74 20 63 72 65   decide that cre
12d50 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ating an ephemer
12d60 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65  al b-tree for me
12d70 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74  mbership.** test
12d80 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e  ing is too expen
12d90 73 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20  sive and return 
12da0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20  IN_INDEX_NOOP.  
12db0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
12dc0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
12dd0 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c  tine should impl
12de0 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65  ement the IN ope
12df0 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65  rator using a se
12e00 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20  quence.** of Eq 
12e10 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e  or Ne comparison
12e20 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   operations..**.
12e30 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72  ** When the b-tr
12e40 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ee is being used
12e50 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
12e60 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69  tests, the calli
12e70 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  ng function.** m
12e80 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ight need to kno
12e90 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  w whether or not
12ea0 20 74 68 65 20 52 48 53 20 73 69 64 65 20 6f 66   the RHS side of
12eb0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
12ec0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e  .** contains a N
12ed0 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61  ULL.  If prRhsHa
12ee0 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e  sNull is not a N
12ef0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  ULL pointer and 
12f00 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
12f10 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20  any chance that 
12f20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20  the (...) might 
12f30 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76  contain a NULL v
12f40 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69  alue at.** runti
12f50 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73  me, then a regis
12f60 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
12f70 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65   and the registe
12f80 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e  r number written
12f90 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73  .** to *prRhsHas
12fa0 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69  Null. If there i
12fb0 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
12fc0 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61   the (...) conta
12fd0 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61  ins a.** NULL va
12fe0 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73  lue, then *prRhs
12ff0 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20  HasNull is left 
13000 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
13010 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
13020 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
13030 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f  its location sto
13040 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73  red in *prRhsHas
13050 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  Null, then.** th
13060 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20  e value in that 
13070 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65  register will be
13080 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74   NULL if the b-t
13090 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ree contains one
130a0 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c   or more.** NULL
130b0 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20   values, and it 
130c0 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e  will be some non
130d0 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74  -NULL value if t
130e0 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69  he b-tree contai
130f0 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61  ns no.** NULL va
13100 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lues..**.** If t
13110 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65 74  he aiMap paramet
13120 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  er is not NULL, 
13130 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  it must point to
13140 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61 69   an array contai
13150 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d  ning.** one elem
13160 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ent for each col
13170 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  umn returned by 
13180 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
13190 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53 0a  ment on the RHS.
131a0 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e  ** of the IN(...
131b0 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20  ) operator. The 
131c0 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  i'th entry of th
131d0 65 20 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c  e array is popul
131e0 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a  ated with the.**
131f0 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 69   offset of the i
13200 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ndex column that
13210 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 27 74   matches the i't
13220 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
13230 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45  d by the.** SELE
13240 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  CT. For example,
13250 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
13260 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64 20  on and selected 
13270 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  index are:.**.**
13280 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53     (?,?,?) IN (S
13290 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52  ELECT a, b, c FR
132a0 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45 41  OM t1).**   CREA
132b0 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
132c0 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a  1(b, c, a);.**.*
132d0 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69  * then aiMap[] i
132e0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
132f0 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23   {2, 0, 1}..*/.#
13300 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13310 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
13320 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
13330 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
13340 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
13350 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
13360 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
13370 58 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X,              
13380 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
13390 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29  -hand side (RHS)
133a0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
133b0 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46  tor */.  u32 inF
133c0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
133d0 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f      /* IN_INDEX_
133e0 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49  LOOP, _MEMBERSHI
133f0 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f  P, and/or _NOOP_
13400 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52  OK */.  int *prR
13410 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20  hsHasNull,      
13420 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
13430 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74  olding NULL stat
13440 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73 20 2a  us.  See notes *
13450 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 20  /.  int *aiMap  
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13470 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 49  * Mapping from I
13480 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f 20 52  ndex fields to R
13490 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a  HS fields */.){.
134a0 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20    Select *p;    
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134c0 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
134d0 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  T to the right o
134e0 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
134f0 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30  .  int eType = 0
13500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13510 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
13520 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49   of RHS table. I
13530 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69  N_INDEX_* */.  i
13540 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
13550 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20  ->nTab++;       
13560 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
13570 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20  f the RHS table 
13580 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55  */.  int mustBeU
13590 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20 20  nique;          
135a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
135b0 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62  ue if RHS must b
135c0 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64  e unique */.  Vd
135d0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
135e0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20  etVdbe(pParse); 
135f0 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
13600 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
13610 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
13620 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
13630 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65  ;.  mustBeUnique
13640 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e   = (inFlags & IN
13650 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b  _INDEX_LOOP)!=0;
13660 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48  ..  /* If the RH
13670 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e  S of this IN(...
13680 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  ) operator is a 
13690 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66 20 69  SELECT, and if i
136a0 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a 20  t matters .  ** 
136b0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
136c0 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  he SELECT result
136d0 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76   contains NULL v
136e0 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77 68 65  alues, check whe
136f0 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74  ther.  ** or not
13700 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c   NULL is actuall
13710 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74 20 6d  y possible (it m
13720 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65  ay not be, for e
13730 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a  xample, due .  *
13740 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  * to NOT NULL co
13750 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65  nstraints in the
13760 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20   schema). If no 
13770 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
13780 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73  possible,.  ** s
13790 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  et prRhsHasNull 
137a0 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f 6e 74  to 0 before cont
137b0 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66  inuing.  */.  if
137c0 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26  ( prRhsHasNull &
137d0 26 20 28 70 58 2d 3e 66 6c 61 67 73 20 26 20 45  & (pX->flags & E
137e0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
137f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45      int i;.    E
13800 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
13810 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  = pX->x.pSelect-
13820 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72  >pEList;.    for
13830 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
13840 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13850 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
13860 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69  prCanBeNull(pELi
13870 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
13880 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
13890 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69 73 74     if( i==pEList
138a0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
138b0 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20   prRhsHasNull = 
138c0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
138d0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
138e0 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  if an existing t
138f0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61  able or index ca
13900 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a  n be used to.  *
13910 2a 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75  * satisfy the qu
13920 65 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72  ery.  This is pr
13930 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65  eferable to gene
13940 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20  rating a new .  
13950 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  ** ephemeral tab
13960 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  le.  */.  if( pP
13970 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26  arse->nErr==0 &&
13980 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64 61 74   (p = isCandidat
13990 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29 21 3d  eForInOpt(pX))!=
139a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
139b0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
139c0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
139d0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
139e0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61  ection */.    Ta
139f0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a10 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74       /* Table <t
13a20 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31  able>. */.    i1
13a30 36 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  6 iDb;          
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a50 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
13a60 20 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f   idx for pTab */
13a70 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
13a80 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
13a90 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72  t;.    int nExpr
13aa0 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
13ab0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
13ac0 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20  ->pEList!=0 );  
13ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
13ae0 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
13af0 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
13b00 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
13b10 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
13b20 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65  Expr!=0 ); /* Be
13b30 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
13b40 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
13b50 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
13b60 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20  ->pSrc!=0 );    
13b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
13b80 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
13b90 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
13ba0 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d  */.    pTab = p-
13bb0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
13bc0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61  ;..    /* Code a
13bd0 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  n OP_Transaction
13be0 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63   and OP_TableLoc
13bf0 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a  k for <table>. *
13c00 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
13c10 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
13c20 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
13c30 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
13c40 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
13c50 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
13c60 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
13c70 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
13c80 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
13c90 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
13ca0 20 20 20 61 73 73 65 72 74 28 76 29 3b 20 20 2f     assert(v);  /
13cb0 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
13cc0 28 29 20 68 61 73 20 61 6c 77 61 79 73 20 62 65  () has always be
13cd0 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61  en previously ca
13ce0 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  lled */.    if( 
13cf0 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69  nExpr==1 && pELi
13d00 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
13d10 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
13d20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49 4e 20     /* The "x IN 
13d30 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52  (SELECT rowid FR
13d40 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73 65 20  OM table)" case 
13d50 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64  */.      int iAd
13d60 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13d70 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
13d80 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
13d90 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
13da0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
13db0 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
13dc0 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
13dd0 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
13de0 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
13df0 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73  _ROWID;..      s
13e00 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13e10 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
13e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
13e30 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e50 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
13e60 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
13e70 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f    int affinity_o
13e80 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  k = 1;.      int
13e90 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68   i;..      /* Ch
13ea0 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66  eck that the aff
13eb0 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20  inity that will 
13ec0 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f  be used to perfo
13ed0 72 6d 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a  rm each .      *
13ee0 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
13ef0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
13f00 61 66 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68  affinity of each
13f10 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
13f20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
13f30 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
13f40 70 65 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20  perator.  If it 
13f50 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  not, it is not p
13f60 6f 73 73 69 62 6c 65 20 74 6f 0a 20 20 20 20 20  ossible to.     
13f70 20 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e 64 65   ** use any inde
13f80 78 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62  x of the RHS tab
13f90 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  le.  */.      fo
13fa0 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26  r(i=0; i<nExpr &
13fb0 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69  & affinity_ok; i
13fc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
13fd0 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65  r *pLhs = sqlite
13fe0 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
13ff0 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69  xpr(pX->pLeft, i
14000 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
14010 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Col = pEList->a[
14020 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  i].pExpr->iColum
14030 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  n;.        char 
14040 69 64 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33  idxaff = sqlite3
14050 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e  TableColumnAffin
14060 69 74 79 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20  ity(pTab,iCol); 
14070 2f 2a 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a  /* RHS table */.
14080 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6d 70          char cmp
14090 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
140a0 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68  pareAffinity(pLh
140b0 73 2c 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20  s, idxaff);.    
140c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d      testcase( cm
140d0 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  paff==SQLITE_AFF
140e0 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 20  _BLOB );.       
140f0 20 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66   testcase( cmpaf
14100 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f==SQLITE_AFF_TE
14110 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77  XT );.        sw
14120 69 74 63 68 28 20 63 6d 70 61 66 66 20 29 7b 0a  itch( cmpaff ){.
14130 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
14140 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a  QLITE_AFF_BLOB:.
14150 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
14160 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  k;.          cas
14170 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
14180 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  T:.            /
14190 2a 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  * sqlite3Compare
141a0 41 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20  Affinity() only 
141b0 72 65 74 75 72 6e 73 20 54 45 58 54 20 69 66 20  returns TEXT if 
141c0 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a  one side or the.
141d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
141e0 74 68 65 72 20 68 61 73 20 6e 6f 20 61 66 66 69  ther has no affi
141f0 6e 69 74 79 20 61 6e 64 20 74 68 65 20 6f 74 68  nity and the oth
14200 65 72 20 73 69 64 65 20 69 73 20 54 45 58 54 2e  er side is TEXT.
14210 20 20 48 65 6e 63 65 2c 0a 20 20 20 20 20 20 20    Hence,.       
14220 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79       ** the only
14230 20 77 61 79 20 66 6f 72 20 63 6d 70 61 66 66 20   way for cmpaff 
14240 74 6f 20 62 65 20 54 45 58 54 20 69 73 20 66 6f  to be TEXT is fo
14250 72 20 69 64 78 61 66 66 20 74 6f 20 62 65 20 54  r idxaff to be T
14260 45 58 54 0a 20 20 20 20 20 20 20 20 20 20 20 20  EXT.            
14270 2a 2a 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74  ** and for the t
14280 65 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  erm on the LHS o
14290 66 20 74 68 65 20 49 4e 20 74 6f 20 68 61 76 65  f the IN to have
142a0 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f   no affinity. */
142b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
142c0 65 72 74 28 20 69 64 78 61 66 66 3d 3d 53 51 4c  ert( idxaff==SQL
142d0 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a  ITE_AFF_TEXT );.
142e0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
142f0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 66  k;.          def
14300 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20  ault:.          
14310 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20    affinity_ok = 
14320 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
14330 41 66 66 69 6e 69 74 79 28 69 64 78 61 66 66 29  Affinity(idxaff)
14340 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14350 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 61    }..      if( a
14360 66 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20  ffinity_ok ){.  
14370 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
14380 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
14390 69 6e 64 65 78 20 74 68 61 74 20 77 69 6c 6c 20  index that will 
143a0 77 6f 72 6b 20 66 6f 72 20 74 68 69 73 20 49 4e  work for this IN
143b0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
143c0 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
143d0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
143e0 20 26 26 20 65 54 79 70 65 3d 3d 30 3b 20 70 49   && eType==0; pI
143f0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
14400 0a 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61  .          Bitma
14410 73 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20 20 20  sk colUsed;     
14420 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74   /* Columns of t
14430 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 2a 2f  he index used */
14440 0a 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61  .          Bitma
14450 73 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20  sk mCol;        
14460 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74 68 65   /* Mask for the
14470 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20   current column 
14480 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
14490 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e   pIdx->nColumn<n
144a0 45 78 70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Expr ) continue;
144b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
144c0 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73  ximum nColumn is
144d0 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d   BMS-2, not BMS-
144e0 31 2c 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  1, so that we ca
144f0 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20 20 20 20  n compute.      
14500 20 20 20 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e      ** BITMASK(n
14510 45 78 70 72 29 20 77 69 74 68 6f 75 74 20 6f 76  Expr) without ov
14520 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20  erflowing */.   
14530 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14540 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
14550 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 20  BMS-2 );.       
14560 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64     testcase( pId
14570 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d  x->nColumn==BMS-
14580 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1 );.          i
14590 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
145a0 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e  >=BMS-1 ) contin
145b0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
145c0 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 29  ( mustBeUnique )
145d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
145e0 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e  ( pIdx->nKeyCol>
145f0 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20  nExpr.          
14600 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c     ||(pIdx->nCol
14610 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20 21 49 73  umn>nExpr && !Is
14620 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
14630 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  )).            )
14640 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
14650 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68  continue;  /* Th
14660 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  is index is not 
14670 75 6e 69 71 75 65 20 6f 76 65 72 20 74 68 65 20  unique over the 
14680 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a  IN RHS columns *
14690 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  /.            }.
146a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20            }.  . 
146b0 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64           colUsed
146c0 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d   = 0;   /* Colum
146d0 6e 73 20 6f 66 20 69 6e 64 65 78 20 75 73 65 64  ns of index used
146e0 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
146f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14700 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
14710 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
14720 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63  Lhs = sqlite3Vec
14730 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
14740 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pX->pLeft, i);. 
14750 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
14760 2a 70 52 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e  *pRhs = pEList->
14770 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
14780 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
14790 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42  *pReq = sqlite3B
147a0 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
147b0 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73  Seq(pParse, pLhs
147c0 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20  , pRhs);.       
147d0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20       int j;.  . 
147e0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
147f0 74 28 20 70 52 65 71 21 3d 30 20 7c 7c 20 70 52  t( pReq!=0 || pR
14800 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f  hs->iColumn==XN_
14810 52 4f 57 49 44 20 7c 7c 20 70 50 61 72 73 65 2d  ROWID || pParse-
14820 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20  >nErr );.       
14830 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
14840 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
14850 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
14860 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
14870 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20  !=pRhs->iColumn 
14880 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14890 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
148a0 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  ( pIdx->azColl[j
148b0 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ] );.           
148c0 20 20 20 69 66 28 20 70 52 65 71 21 3d 30 20 26     if( pReq!=0 &
148d0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
148e0 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49  (pReq->zName, pI
148f0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  dx->azColl[j])!=
14900 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
14910 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
14940 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
14950 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
14960 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62 72 65  ( j==nExpr ) bre
14970 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
14980 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a  mCol = MASKBIT(j
14990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
149a0 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65  f( mCol & colUse
149b0 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61  d ) break; /* Ea
149c0 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f  ch column used o
149d0 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20  nly once */.    
149e0 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20          colUsed 
149f0 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20  |= mCol;.       
14a00 20 20 20 20 20 69 66 28 20 61 69 4d 61 70 20 29       if( aiMap )
14a10 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20   aiMap[i] = j;. 
14a20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
14a30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14a40 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55  i==nExpr || colU
14a50 73 65 64 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45  sed!=(MASKBIT(nE
14a60 78 70 72 29 2d 31 29 20 29 3b 0a 20 20 20 20 20  xpr)-1) );.     
14a70 20 20 20 20 20 69 66 28 20 63 6f 6c 55 73 65 64       if( colUsed
14a80 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72  ==(MASKBIT(nExpr
14a90 29 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  )-1) ){.        
14aa0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
14ab0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  ch this point, t
14ac0 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 69 6e  hat means the in
14ad0 64 65 78 20 70 49 64 78 20 69 73 20 75 73 61 62  dex pIdx is usab
14ae0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
14af0 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
14b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
14b10 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
14b20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14b30 20 20 20 20 20 20 20 20 20 20 45 78 70 6c 61 69            Explai
14b40 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
14b50 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  se, 0,.         
14b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b70 20 20 20 20 20 22 55 53 49 4e 47 20 49 4e 44 45       "USING INDE
14b80 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52  X %s FOR IN-OPER
14b90 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d  ATOR",pIdx->zNam
14ba0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
14bb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14bc0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
14bd0 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74  d, iTab, pIdx->t
14be0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
14bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14c00 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
14c10 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
14c20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
14c30 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
14c40 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
14c50 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
14c60 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  t( IN_INDEX_INDE
14c70 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44  X_DESC == IN_IND
14c80 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29  EX_INDEX_ASC+1 )
14c90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 54  ;.            eT
14ca0 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
14cb0 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d  NDEX_ASC + pIdx-
14cc0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a  >aSortOrder[0];.
14cd0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69    .            i
14ce0 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
14cf0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
14d00 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
14d10 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20  SED_MASK.       
14d20 20 20 20 20 20 20 20 69 36 34 20 6d 61 73 6b 20         i64 mask 
14d30 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a  = (1<<nExpr)-1;.
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
14d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
14d60 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
14d70 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20  sUsed, .        
14d80 20 20 20 20 20 20 20 20 20 20 69 54 61 62 2c 20            iTab, 
14d90 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b  0, 0, (u8*)&mask
14da0 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e  , P4_INT64);.#en
14db0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
14dc0 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
14dd0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
14de0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14df0 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a  if( nExpr==1 ){.
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e10 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
14e20 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a  lFlag(v, iTab, *
14e30 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20  prRhsHasNull);. 
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
14e50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
14e60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14e70 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14e80 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  iAddr);.        
14e90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a    }.        } /*
14ea0 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 69   End loop over i
14eb0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20 20 20  ndexes */.      
14ec0 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61 66 66  } /* End if( aff
14ed0 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20  inity_ok ) */.  
14ee0 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20 6e 6f    } /* End if no
14ef0 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64 65 78  t an rowid index
14f00 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 61   */.  } /* End a
14f10 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69  ttempt to optimi
14f20 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  ze using an inde
14f30 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  x */..  /* If no
14f40 20 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64   preexisting ind
14f50 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ex is available 
14f60 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73  for the IN claus
14f70 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e  e.  ** and IN_IN
14f80 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61  DEX_NOOP is an a
14f90 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a  llowed reply.  *
14fa0 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66  * and the RHS of
14fb0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
14fc0 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20   is a list, not 
14fd0 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  a subquery.  ** 
14fe0 61 6e 64 20 74 68 65 20 52 48 53 20 69 73 20 6e  and the RHS is n
14ff0 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68  ot constant or h
15000 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  as two or fewer 
15010 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e  terms,.  ** then
15020 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68   it is not worth
15030 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
15040 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
15050 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68  evaluate.  ** th
15060 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f  e IN operator so
15070 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58   return IN_INDEX
15080 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66  _NOOP..  */.  if
15090 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26  ( eType==0.   &&
150a0 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
150b0 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20  NDEX_NOOP_OK).  
150c0 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
150d0 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
150e0 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21 73  elect).   && (!s
150f0 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
15100 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d  stant(pX) || pX-
15110 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c  >x.pList->nExpr<
15120 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79  =2).  ){.    eTy
15130 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  pe = IN_INDEX_NO
15140 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65  OP;.  }..  if( e
15150 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Type==0 ){.    /
15160 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  * Could not find
15170 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
15180 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75  le or index to u
15190 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d  se as the RHS b-
151a0 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  tree..    ** We 
151b0 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e  will have to gen
151c0 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  erate an ephemer
151d0 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74  al table to do t
151e0 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  he job..    */. 
151f0 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75 65     u32 savedNQue
15200 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
15210 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  >nQueryLoop;.   
15220 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
15230 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65  l = 0;.    eType
15240 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b   = IN_INDEX_EPH;
15250 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73  .    if( inFlags
15260 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
15270 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
15280 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30  ->nQueryLoop = 0
15290 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
152a0 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pLeft->iColumn<0
152b0 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
152c0 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
152d0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
152e0 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
152f0 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  EX_ROWID;.      
15300 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
15310 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a  prRhsHasNull ){.
15320 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e        *prRhsHasN
15330 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75  ull = rMayHaveNu
15340 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
15350 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  Mem;.    }.    s
15360 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
15370 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20  ect(pParse, pX, 
15380 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54  rMayHaveNull, eT
15390 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
153a0 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65  WID);.    pParse
153b0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73  ->nQueryLoop = s
153c0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
153d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d    }else{.    pX-
153e0 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
153f0 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61 70    }..  if( aiMap
15400 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e   && eType!=IN_IN
15410 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26 26  DEX_INDEX_ASC &&
15420 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58   eType!=IN_INDEX
15430 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20  _INDEX_DESC ){. 
15440 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20     int i, n;.   
15450 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   n = sqlite3Expr
15460 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e 70  VectorSize(pX->p
15470 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  Left);.    for(i
15480 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61 69  =0; i<n; i++) ai
15490 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a  Map[i] = i;.  }.
154a0 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a    return eType;.
154b0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
154c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
154d0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67  BQUERY./*.** Arg
154e0 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20 61  ument pExpr is a
154f0 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e  n (?, ?...) IN(.
15500 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ..) expression. 
15510 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
15520 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  n allocates and 
15530 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74 65  returns a nul-te
15540 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
15550 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74  containing .** t
15560 68 65 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f  he affinities to
15570 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 61 63   be used for eac
15580 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
15590 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a  comparison..**.*
155a0 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
155b0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
155c0 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75  e caller to ensu
155d0 72 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75  re that the retu
155e0 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20 69  rned.** string i
155f0 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  s eventually fre
15600 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
15610 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  DbFree()..*/.sta
15620 74 69 63 20 63 68 61 72 20 2a 65 78 70 72 49 4e  tic char *exprIN
15630 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a  Affinity(Parse *
15640 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
15650 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c  xpr){.  Expr *pL
15660 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
15670 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d  ft;.  int nVal =
15680 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
15690 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20  orSize(pLeft);. 
156a0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
156b0 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73   = (pExpr->flags
156c0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
156d0 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   ? pExpr->x.pSel
156e0 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61 72 20  ect : 0;.  char 
156f0 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65 72 74  *zRet;..  assert
15700 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
15710 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20 73  IN );.  zRet = s
15720 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
15730 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56  w(pParse->db, nV
15740 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a 52 65  al+1);.  if( zRe
15750 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
15760 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
15770 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Val; i++){.     
15780 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71 6c 69   Expr *pA = sqli
15790 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
157a0 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
157b0 0a 20 20 20 20 20 20 63 68 61 72 20 61 20 3d 20  .      char a = 
157c0 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
157d0 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20 20 69  ity(pA);.      i
157e0 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
157f0 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20        zRet[i] = 
15800 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
15810 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74 2d 3e  finity(pSelect->
15820 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
15830 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20 7d 65  pr, a);.      }e
15840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  lse{.        zRe
15850 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20 20 20  t[i] = a;.      
15860 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 74  }.    }.    zRet
15870 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20  [nVal] = '\0';. 
15880 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74   }.  return zRet
15890 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
158a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
158b0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c  SUBQUERY./*.** L
158c0 6f 61 64 20 74 68 65 20 50 61 72 73 65 20 6f 62  oad the Parse ob
158d0 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
158e0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
158f0 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  t with an error 
15900 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66 20 74  .** message of t
15910 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
15920 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74   "sub-select ret
15930 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d  urns N columns -
15940 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a 2f 20   expected M".*/ 
15950 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53    .void sqlite3S
15960 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 50 61  ubselectError(Pa
15970 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
15980 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20 6e 45   nActual, int nE
15990 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73 74 20  xpect){.  const 
159a0 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22 73 75  char *zFmt = "su
159b0 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
159c0 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78   %d columns - ex
159d0 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20 73 71  pected %d";.  sq
159e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
159f0 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41 63 74  arse, zFmt, nAct
15a00 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b 0a 7d  ual, nExpect);.}
15a10 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45  .#endif../*.** E
15a20 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
15a30 69 73 20 61 20 76 65 63 74 6f 72 20 74 68 61 74  is a vector that
15a40 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 69   has been used i
15a50 6e 20 61 20 63 6f 6e 74 65 78 74 20 77 68 65 72  n a context wher
15a60 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 70  e.** it is not p
15a70 65 72 6d 69 74 74 65 64 2e 20 49 66 20 70 45 78  ermitted. If pEx
15a80 70 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  pr is a sub-sele
15a90 63 74 20 76 65 63 74 6f 72 2c 20 74 68 69 73 20  ct vector, this 
15aa0 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64  routine .** load
15ab0 73 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  s the Parse obje
15ac0 63 74 20 77 69 74 68 20 61 20 6d 65 73 73 61 67  ct with a messag
15ad0 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  e of the form:.*
15ae0 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65  *.**   "sub-sele
15af0 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c  ct returns N col
15b00 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
15b10 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  1".**.** Or, if 
15b20 69 74 20 69 73 20 61 20 72 65 67 75 6c 61 72 20  it is a regular 
15b30 73 63 61 6c 61 72 20 76 65 63 74 6f 72 3a 0a 2a  scalar vector:.*
15b40 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61 6c 75  *.**   "row valu
15b50 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20 20 20  e misused".*/   
15b60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 65 63  .void sqlite3Vec
15b70 74 6f 72 45 72 72 6f 72 4d 73 67 28 50 61 72 73  torErrorMsg(Pars
15b80 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
15b90 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e 64 65 66  *pExpr){.#ifndef
15ba0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
15bb0 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70  QUERY.  if( pExp
15bc0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  r->flags & EP_xI
15bd0 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  sSelect ){.    s
15be0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
15bf0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 78  rror(pParse, pEx
15c00 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
15c10 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29  EList->nExpr, 1)
15c20 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
15c30 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
15c40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15c50 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75   "row value misu
15c60 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  sed");.  }.}../*
15c70 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
15c80 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62  e for scalar sub
15c90 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20  queries used as 
15ca0 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65  a subquery expre
15cb0 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a  ssion, EXISTS,.*
15cc0 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  * or IN operator
15cd0 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  s.  Examples:.**
15ce0 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20  .**     (SELECT 
15cf0 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20  a FROM b)       
15d00 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a     -- subquery.*
15d10 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45  *     EXISTS (SE
15d20 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
15d30 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75   -- EXISTS subqu
15d40 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ery.**     x IN 
15d50 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
15d60 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
15d70 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
15d80 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
15d90 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
15da0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
15db0 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
15dc0 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
15dd0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
15de0 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
15df0 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65  rameter describe
15e00 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
15e10 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
15e20 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f  he IN.** operato
15e30 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a  r or subquery..*
15e40 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
15e50 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e  r isRowid is non
15e60 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72  -zero, then expr
15e70 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
15e80 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
15e90 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
15ea0 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20  "<rowid> IN (?, 
15eb0 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72  ?, ?)", where <r
15ec0 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72  owid> is a refer
15ed0 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20  ence.** to some 
15ee0 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75  integer key colu
15ef0 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d  mn of a table B-
15f00 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Tree. In this ca
15f10 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e  se, use an.** in
15f20 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73  tkey B-Tree to s
15f30 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
15f40 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69  IN(...) values i
15f50 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
15f60 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20  ual.** (slower) 
15f70 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
15f80 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a  keys B-Tree..**.
15f90 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75  ** If rMayHaveNu
15fa0 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
15fb0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
15fc0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  the operation is
15fd0 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61   an IN.** (not a
15fe0 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
15ff0 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  S) and that the 
16000 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  RHS might contai
16010 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c  ns NULLs..** All
16020 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
16030 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  es is initialize
16040 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67 69   the register gi
16050 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e  ven by rMayHaveN
16060 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20  ull.** to NULL. 
16070 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   Calling routine
16080 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65  s will take care
16090 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69   of changing thi
160a0 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61  s register.** va
160b0 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20  lue to non-NULL 
160c0 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55  if the RHS is NU
160d0 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46  LL-free..**.** F
160e0 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45  or a SELECT or E
160f0 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20  XISTS operator, 
16100 72 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  return the regis
16110 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ter that holds t
16120 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46  he.** result.  F
16130 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d  or a multi-colum
16140 6e 20 53 45 4c 45 43 54 2c 20 74 68 65 20 72 65  n SELECT, the re
16150 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69  sult is stored i
16160 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a  n a contiguous.*
16170 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  * array of regis
16180 74 65 72 73 20 61 6e 64 20 74 68 65 20 72 65 74  ters and the ret
16190 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
161a0 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65   register of the
161b0 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65   left-most.** re
161c0 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 52 65  sult column.  Re
161d0 74 75 72 6e 20 30 20 66 6f 72 20 49 4e 20 6f 70  turn 0 for IN op
161e0 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e  erators or if an
161f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
16200 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
16210 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
16220 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  nt sqlite3CodeSu
16230 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  bselect(.  Parse
16240 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
16250 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
16260 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
16270 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
16280 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45     /* The IN, SE
16290 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20  LECT, or EXISTS 
162a0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
162b0 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20  t rHasNullFlag, 
162c0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
162d0 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77  r that records w
162e0 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69  hether NULLs exi
162f0 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69  st in RHS */.  i
16300 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20  nt isRowid      
16310 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
16320 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65  e, LHS of IN ope
16330 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64  rator is a rowid
16340 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70   */.){.  int jmp
16350 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20  IfDynamic = -1; 
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
16380 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f   test address */
16390 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b  .  int rReg = 0;
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
163c0 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72  gister storing r
163d0 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64  esulting */.  Vd
163e0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
163f0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16400 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
16410 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
16420 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16430 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20  Push(pParse);.. 
16440 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69   /* The evaluati
16450 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45 58 49  on of the IN/EXI
16460 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73 74 20  STS/SELECT must 
16470 62 65 20 72 65 70 65 61 74 65 64 20 65 76 65 72  be repeated ever
16480 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69  y time it.  ** i
16490 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66  s encountered if
164a0 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
164b0 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20  owing is true:. 
164c0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54   **.  **    *  T
164d0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
164e0 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  de is a correlat
164f0 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  ed subquery.  **
16500 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
16510 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e  -hand side is an
16520 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
16530 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69   containing vari
16540 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20  ables.  **    * 
16550 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61   We are inside a
16560 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20   trigger.  **.  
16570 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
16580 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65   above are false
16590 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75  , then we can ru
165a0 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74  n this code just
165b0 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20   once.  ** save 
165c0 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64  the results, and
165d0 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
165e0 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71  result on subseq
165f0 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73  uent invocations
16600 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78  ..  */.  if( !Ex
16610 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
16620 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
16630 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44  t) ){.    jmpIfD
16640 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74 65 33  ynamic = sqlite3
16650 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
16660 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
16670 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
16680 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
16690 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
166a0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
166b0 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
166c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
166d0 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
166e0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
166f0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
16700 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
16710 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20  ->pLeft; /* the 
16720 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
16730 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
16740 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16750 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b  o = 0;      /* K
16760 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ey information *
16770 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c  /.      int nVal
16780 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16790 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76      /* Size of v
167a0 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20  ector pLeft */. 
167b0 20 20 20 20 20 0a 20 20 20 20 20 20 6e 56 61 6c       .      nVal
167c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
167d0 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
167e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
167f0 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d  isRowid || nVal=
16800 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =1 );..      /* 
16810 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
16820 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
16830 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
16840 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
16850 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
16860 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
16870 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41  the same way.  A
16880 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
16890 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
168a0 69 6c 6c 65 64 20 77 69 74 68 20 69 6e 64 65 78  illed with index
168b0 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69   keys representi
168c0 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  ng the results f
168d0 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a  rom the .      *
168e0 2a 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  * SELECT or the 
168f0 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
16900 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
16910 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
16920 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
16930 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
16940 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
16950 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
16960 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
16970 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
16980 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
16990 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
169a0 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
169b0 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
169c0 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
169d0 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
169e0 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
169f0 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
16a00 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
16a10 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
16a20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
16a30 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
16a40 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
16a50 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
16a60 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
16a70 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
16a80 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
16a90 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
16aa0 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
16ab0 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
16ac0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
16ad0 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
16ae0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
16af0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
16b00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16b10 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
16b20 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70   .          pExp
16b30 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73 52 6f  r->iTable, (isRo
16b40 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20  wid?0:nVal));.  
16b50 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69      pKeyInfo = i
16b60 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c  sRowid ? 0 : sql
16b70 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
16b80 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61  (pParse->db, nVa
16b90 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66  l, 1);..      if
16ba0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
16bb0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
16bc0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
16bd0 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
16be0 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
16bf0 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
16c00 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
16c10 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
16c20 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
16c30 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
16c40 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
16c50 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
16c60 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
16c70 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
16c80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16c90 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
16ca0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
16cb0 63 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  ct;.        Expr
16cc0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
16cd0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
16ce0 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
16cf0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
16d00 65 2c 20 31 2c 20 22 25 73 4c 49 53 54 20 53 55  e, 1, "%sLIST SU
16d10 42 51 55 45 52 59 22 2c 0a 20 20 20 20 20 20 20  BQUERY",.       
16d20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
16d30 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41  c>=0?"":"CORRELA
16d40 54 45 44 20 22 0a 20 20 20 20 20 20 20 20 29 29  TED ".        ))
16d50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16d60 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
16d70 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16d80 4c 48 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74  LHS and RHS of t
16d90 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64  he IN operator d
16da0 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61  o not match, tha
16db0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72  t.        ** err
16dc0 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  or will have bee
16dd0 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62 65  n caught long be
16de0 66 6f 72 65 20 77 65 20 72 65 61 63 68 20 74 68  fore we reach th
16df0 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20  is point. */.   
16e00 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
16e10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e  pEList->nExpr==n
16e20 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
16e30 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
16e40 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  t;.          int
16e50 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   i;.          sq
16e60 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
16e70 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
16e80 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
16e90 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65  e);.          de
16ea0 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78  st.zAffSdst = ex
16eb0 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61  prINAffinity(pPa
16ec0 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
16ed0 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e         pSelect->
16ee0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
16ef0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16f00 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
16f10 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
16f20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
16f30 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d  tcase( pKeyInfo=
16f40 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20  =0 ); /* Caused 
16f50 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65  by OOM in sqlite
16f60 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20  3KeyInfoAlloc() 
16f70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
16f80 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
16f90 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
16fa0 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
16fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
16fc0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
16fd0 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16ff0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
17000 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pKeyInfo);.     
17010 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
17020 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
17040 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
17050 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b   dest.zAffSdst);
17060 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17070 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
17080 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
17090 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
170a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
170b0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
170c0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
170d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
170e0 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
170f0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >0 );.          
17100 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
17110 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
17120 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
17130 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
17140 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
17150 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
17160 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63   *p = sqlite3Vec
17170 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
17180 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
17190 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
171a0 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  >aColl[i] = sqli
171b0 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
171c0 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20 20 20  CollSeq(.       
171d0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
171e0 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   p, pEList->a[i]
171f0 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20 20 20  .pExpr.         
17200 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
17210 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
17220 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
17230 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
17240 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
17250 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
17260 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
17270 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
17280 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63        ** For eac
17290 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
172a0 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
172b0 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
172c0 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
172d0 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
172e0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
172f0 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
17300 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
17310 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
17320 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
17330 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
17340 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
17350 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
17360 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
17370 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
17380 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
17390 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
173a0 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
173b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
173c0 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20  nity of the LHS 
173d0 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20  of the IN */.   
173e0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
173f0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
17400 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
17410 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74  List;.        st
17420 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
17430 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
17440 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
17450 33 3b 0a 20 20 20 20 20 20 20 20 61 66 66 69 6e  3;.        affin
17460 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
17470 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
17480 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  ;.        if( !a
17490 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
174a0 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
174b0 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
174c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
174d0 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
174e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
174f0 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
17500 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
17510 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
17520 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
17530 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
17540 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
17550 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
17560 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ft);.        }..
17570 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
17580 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
17590 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
175a0 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20  list>. */.      
175b0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
175c0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
175d0 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
175e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
175f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17600 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 20    if( isRowid ) 
17610 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17620 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c  4(v, OP_Blob, 0,
17630 20 72 32 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53   r2, 0, "", P4_S
17640 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
17650 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
17660 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
17670 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
17680 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
17690 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
176a0 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
176b0 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f        int iValTo
176c0 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  Ins;..          
176d0 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  /* If the expres
176e0 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73  sion is not cons
176f0 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c  tant then we wil
17700 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  l need to.      
17710 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
17720 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73  he test that was
17730 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65   generated above
17740 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
17750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
17760 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65  is code only exe
17770 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63  cutes once.  Bec
17780 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63  ause for a non-c
17790 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20  onstant.        
177a0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
177b0 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e  we need to rerun
177c0 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20   this code each 
177d0 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20  time..          
177e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
177f0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
17800 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
17810 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
17820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
17830 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17840 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44  ToNoop(v, jmpIfD
17850 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20 20 20  ynamic);.       
17860 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
17870 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
17880 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
17890 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
178a0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
178b0 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
178c0 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
178d0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
178e0 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45  owid && sqlite3E
178f0 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32  xprIsInteger(pE2
17900 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b  , &iValToIns) ){
17910 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
17920 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17930 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20  , OP_InsertInt, 
17940 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
17950 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20  2, iValToIns);. 
17960 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
17970 20 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d              r3 =
17980 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17990 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
179a0 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  E2, r1);.       
179b0 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
179c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
179d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
179e0 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
179f0 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  Int, r3,.       
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17a20 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
17a30 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20  v)+2);.         
17a40 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
17a50 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
17a60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17a70 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
17a80 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
17a90 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20  e, r2, r3);.    
17aa0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
17ac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17ad0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
17ae0 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66   r3, 1, r2, &aff
17af0 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
17b00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17b10 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
17b20 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
17b30 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r3, 1);.        
17b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17b50 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
17b60 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70  _IdxInsert, pExp
17b70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
17b80 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 1);.         
17b90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
17ba0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17bb0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17bc0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17bd0 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
17be0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
17bf0 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
17c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17c10 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
17c20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17c30 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
17c40 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79  dr, (void *)pKey
17c50 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
17c60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17c70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
17c80 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
17c90 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
17ca0 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75  ELECT:.    defau
17cb0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43  lt: {.      /* C
17cc0 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c 45 43  ase 3:    (SELEC
17cd0 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a  T ... FROM ...).
17ce0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a        **     or:
17cf0 20 20 20 20 45 58 49 53 54 53 28 53 45 4c 45 43      EXISTS(SELEC
17d00 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a  T ... FROM ...).
17d10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17d20 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20  * For a SELECT, 
17d30 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
17d40 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 73 20   put the values 
17d50 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  for all columns 
17d60 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
17d70 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f 20 61  first row into a
17d80 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
17d90 74 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ters and return 
17da0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20 20 20  the index of.   
17db0 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
17dc0 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 20 20  register..      
17dd0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
17de0 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53  his is an EXISTS
17df0 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67  , write an integ
17e00 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73  er 0 (not exists
17e10 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a  ) or 1 (exists).
17e20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20        ** into a 
17e30 72 65 67 69 73 74 65 72 20 61 6e 64 20 72 65 74  register and ret
17e40 75 72 6e 20 74 68 61 74 20 72 65 67 69 73 74 65  urn that registe
17e50 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20  r number..      
17e60 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 62  **.      ** In b
17e70 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 71  oth cases, the q
17e80 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65  uery is augmente
17e90 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22  d with "LIMIT 1"
17ea0 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a  .  Any .      **
17eb0 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d   preexisting lim
17ec0 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 20  it is discarded 
17ed0 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  in place of the 
17ee0 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20  new LIMIT 1..   
17ef0 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65     */.      Sele
17f00 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20  ct *pSel;       
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
17f30 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20  ement to encode 
17f40 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  */.      SelectD
17f50 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20  est dest;       
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17f70 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69  * How to deal wi
17f80 74 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  th SELECT result
17f90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 52   */.      int nR
17fa0 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fc0 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f 20  /* Registers to 
17fd0 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 20 20  allocate */.    
17fe0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20    Expr *pLimit; 
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18000 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c          /* New l
18010 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20  imit expression 
18020 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  */..      testca
18030 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
18040 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
18050 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
18060 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
18070 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
18080 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
18090 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d  EXISTS || pExpr-
180a0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
180b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
180c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
180d0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
180e0 65 63 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  ect) );..      p
180f0 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  Sel = pExpr->x.p
18100 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78  Select;.      Ex
18110 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
18120 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 53 43  pParse, 1, "%sSC
18130 41 4c 41 52 20 53 55 42 51 55 45 52 59 22 2c 0a  ALAR SUBQUERY",.
18140 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49              jmpI
18150 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22  fDynamic>=0?"":"
18160 43 4f 52 52 45 4c 41 54 45 44 20 22 29 29 3b 0a  CORRELATED "));.
18170 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70 45 78        nReg = pEx
18180 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
18190 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  T ? pSel->pEList
181a0 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20 20  ->nExpr : 1;.   
181b0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
181c0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
181d0 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b  0, pParse->nMem+
181e0 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
181f0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
18200 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
18210 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
18220 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65  {.        dest.e
18230 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a  Dest = SRT_Mem;.
18240 20 20 20 20 20 20 20 20 64 65 73 74 2e 69 53 64          dest.iSd
18250 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  st = dest.iSDPar
18260 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  m;.        dest.
18270 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20  nSdst = nReg;.  
18280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18290 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
182a0 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  ll, 0, dest.iSDP
182b0 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50 61 72  arm, dest.iSDPar
182c0 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20 20  m+nReg-1);.     
182d0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
182e0 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72  v, "Init subquer
182f0 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
18300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18310 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
18320 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20  RT_Exists;.     
18330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18340 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
18350 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  er, 0, dest.iSDP
18360 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
18370 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
18380 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c  nit EXISTS resul
18390 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t"));.      }.  
183a0 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 73 71 6c      pLimit = sql
183b0 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
183c0 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54  arse->db, TK_INT
183d0 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49 6e 74  EGER,&sqlite3Int
183e0 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20  Tokens[1], 0);. 
183f0 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 70       if( pSel->p
18400 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
18410 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
18420 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
18430 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65  Sel->pLimit->pLe
18440 66 74 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65  ft);.        pSe
18450 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  l->pLimit->pLeft
18460 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
18470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18480 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pSel->pLimit = s
18490 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
184a0 73 65 2c 20 54 4b 5f 4c 49 4d 49 54 2c 20 70 4c  se, TK_LIMIT, pL
184b0 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  imit, 0);.      
184c0 7d 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c  }.      pSel->iL
184d0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
184e0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
184f0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
18500 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
18510 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
18520 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d    }.      rReg =
18530 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
18540 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
18550 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18560 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
18570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18580 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e    }..  if( rHasN
18590 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  ullFlag ){.    s
185a0 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
185b0 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69  Flag(v, pExpr->i
185c0 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46  Table, rHasNullF
185d0 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lag);.  }..  if(
185e0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
185f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
18600 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
18610 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20  mpIfDynamic);.  
18620 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
18630 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
18640 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b  ..  return rReg;
18650 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
18660 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
18670 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
18680 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
18690 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49  RY./*.** Expr pI
186a0 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20  n is an IN(...) 
186b0 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73  expression. This
186c0 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
186d0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75   that the .** su
186e0 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20  b-select on the 
186f0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20  RHS of the IN() 
18700 6f 70 65 72 61 74 6f 72 20 68 61 73 20 74 68 65  operator has the
18710 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
18720 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74  .** columns as t
18730 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65  he vector on the
18740 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65   LHS. Or, if the
18750 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29   RHS of the IN()
18760 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75   is not .** a su
18770 62 2d 71 75 65 72 79 2c 20 74 68 61 74 20 74 68  b-query, that th
18780 65 20 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f  e LHS is a vecto
18790 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a  r of size 1..*/.
187a0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
187b0 68 65 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50  heckIN(Parse *pP
187c0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29  arse, Expr *pIn)
187d0 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20  {.  int nVector 
187e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
187f0 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65  torSize(pIn->pLe
18800 66 74 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d  ft);.  if( (pIn-
18810 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
18820 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66  elect) ){.    if
18830 28 20 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e  ( nVector!=pIn->
18840 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
18850 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
18860 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
18870 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
18880 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  pIn->x.pSelect->
18890 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e  pEList->nExpr, n
188a0 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72  Vector);.      r
188b0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
188c0 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74   }else if( nVect
188d0 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  or!=1 ){.    sql
188e0 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d  ite3VectorErrorM
188f0 73 67 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  sg(pParse, pIn->
18900 70 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75  pLeft);.    retu
18910 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
18920 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
18930 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18940 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
18950 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
18960 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65   for an IN expre
18970 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
18980 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
18990 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  ..).**      x IN
189a0 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
189b0 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ...).**.** The l
189c0 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c  eft-hand side (L
189d0 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20  HS) is a scalar 
189e0 6f 72 20 76 65 63 74 6f 72 20 65 78 70 72 65 73  or vector expres
189f0 73 69 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72  sion.  The .** r
18a00 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28  ight-hand side (
18a10 52 48 53 29 20 69 73 20 61 6e 20 61 72 72 61 79  RHS) is an array
18a20 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
18a30 20 73 63 61 6c 61 72 20 76 61 6c 75 65 73 2c 20   scalar values, 
18a40 6f 72 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79  or a.** subquery
18a50 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
18a60 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
18a70 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
18a80 74 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a  t columns must.*
18a90 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  * match the numb
18aa0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
18ab0 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74   the vector on t
18ac0 68 65 20 4c 48 53 2e 20 20 49 66 20 74 68 65 20  he LHS.  If the 
18ad0 52 48 53 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74  RHS is.** a list
18ae0 20 6f 66 20 76 61 6c 75 65 73 2c 20 74 68 65 20   of values, the 
18af0 4c 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 63  LHS must be a sc
18b00 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  alar. .**.** The
18b10 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
18b20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20  true if the LHS 
18b30 76 61 6c 75 65 20 69 73 20 63 6f 6e 74 61 69 6e  value is contain
18b40 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
18b50 53 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  S..** The result
18b60 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
18b70 20 4c 48 53 20 69 73 20 64 65 66 69 6e 69 74 65   LHS is definite
18b80 6c 79 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 48  ly not in the RH
18b90 53 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 73 75  S.  The .** resu
18ba0 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  lt is NULL if th
18bb0 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 74 68  e presence of th
18bc0 65 20 4c 48 53 20 69 6e 20 74 68 65 20 52 48 53  e LHS in the RHS
18bd0 20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64   cannot be .** d
18be0 65 74 65 72 6d 69 6e 65 64 20 64 75 65 20 74 6f  etermined due to
18bf0 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   NULLs..**.** Th
18c00 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
18c10 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a  ates code that j
18c20 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61  umps to destIfFa
18c30 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
18c40 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
18c50 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
18c60 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
18c70 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
18c80 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
18c90 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
18ca0 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
18cb0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
18cc0 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
18cd0 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
18ce0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
18cf0 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
18d00 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ough..**.** See 
18d10 74 68 65 20 73 65 70 61 72 61 74 65 20 69 6e 2d  the separate in-
18d20 6f 70 65 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75  operator.md docu
18d30 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65 20 69  mentation file i
18d40 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a  n the canonical.
18d50 2a 2a 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65  ** SQLite source
18d60 20 74 72 65 65 20 66 6f 72 20 61 64 64 69 74 69   tree for additi
18d70 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
18d80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18d90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18da0 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  IN(.  Parse *pPa
18db0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
18dc0 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
18dd0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
18de0 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
18df0 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
18e00 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69   The IN expressi
18e10 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
18e20 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a  IfFalse,      /*
18e30 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48   Jump here if LH
18e40 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
18e50 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f  ed in the RHS */
18e60 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c  .  int destIfNul
18e70 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  l        /* Jump
18e80 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73   here if the res
18e90 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e  ults are unknown
18ea0 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f   due to NULLs */
18eb0 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61  .){.  int rRhsHa
18ec0 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52  sNull = 0;  /* R
18ed0 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20  egister that is 
18ee0 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74  true if RHS cont
18ef0 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
18f00 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   */.  int eType;
18f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18f20 79 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a  ype of the RHS *
18f30 2f 0a 20 20 69 6e 74 20 72 4c 68 73 3b 20 20 20  /.  int rLhs;   
18f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
18f50 69 73 74 65 72 28 73 29 20 68 6f 6c 64 69 6e 67  ister(s) holding
18f60 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 73 20   the LHS values 
18f70 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 4f 72 69  */.  int rLhsOri
18f80 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48  g;         /* LH
18f90 53 20 76 61 6c 75 65 73 20 70 72 69 6f 72 20 74  S values prior t
18fa0 6f 20 72 65 6f 72 64 65 72 69 6e 67 20 62 79 20  o reordering by 
18fb0 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62  aiMap[] */.  Vdb
18fc0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
18fd0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
18fe0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18ff0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d  on */.  int *aiM
19000 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ap = 0;       /*
19010 20 4d 61 70 20 66 72 6f 6d 20 76 65 63 74 6f 72   Map from vector
19020 20 66 69 65 6c 64 20 74 6f 20 69 6e 64 65 78 20   field to index 
19030 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
19040 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20 20 20   *zAff = 0;     
19050 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74    /* Affinity st
19060 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72 69  ring for compari
19070 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  sons */.  int nV
19080 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ector;          
19090 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f  /* Size of vecto
190a0 72 73 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f  rs for this IN o
190b0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
190c0 20 69 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20   iDummy;        
190d0 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61     /* Dummy para
190e0 6d 65 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64  meter to exprCod
190f0 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45  eVector() */.  E
19100 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  xpr *pLeft;     
19110 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20       /* The LHS 
19120 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
19130 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  or */.  int i;  
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19150 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
19160 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 32  .  int destStep2
19170 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ;        /* Wher
19180 65 20 74 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e  e to jump when N
19190 55 4c 4c 73 20 73 65 65 6e 20 69 6e 20 73 74 65  ULLs seen in ste
191a0 70 20 32 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  p 2 */.  int des
191b0 74 53 74 65 70 36 20 3d 20 30 3b 20 20 20 20 2f  tStep6 = 0;    /
191c0 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20  * Start of code 
191d0 66 6f 72 20 53 74 65 70 20 36 20 2a 2f 0a 20 20  for Step 6 */.  
191e0 69 6e 74 20 61 64 64 72 54 72 75 74 68 4f 70 3b  int addrTruthOp;
191f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
19200 20 6f 66 20 6f 70 63 6f 64 65 20 74 68 61 74 20   of opcode that 
19210 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 49  determines the I
19220 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69  N is true */.  i
19230 6e 74 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20  nt destNotNull; 
19240 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
19250 65 20 69 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  e if a compariso
19260 6e 20 69 73 20 6e 6f 74 20 74 72 75 65 20 69 6e  n is not true in
19270 20 73 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74   step 6 */.  int
19280 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
19290 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
192a0 20 73 74 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20   step-6 loop */ 
192b0 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70  ..  pLeft = pExp
192c0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 66 28 20  r->pLeft;.  if( 
192d0 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
192e0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
192f0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 41  ) ) return;.  zA
19300 66 66 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e  ff = exprINAffin
19310 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70  ity(pParse, pExp
19320 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72 20 3d 20  r);.  nVector = 
19330 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
19340 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65  rSize(pExpr->pLe
19350 66 74 29 3b 0a 20 20 61 69 4d 61 70 20 3d 20 28  ft);.  aiMap = (
19360 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  int*)sqlite3DbMa
19370 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 20 20  llocZero(.      
19380 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 65 63  pParse->db, nVec
19390 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69 6e 74 29  tor*(sizeof(int)
193a0 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 29 29   + sizeof(char))
193b0 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69 66 28 20   + 1.  );.  if( 
193c0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
193d0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
193e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
193f0 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20  N_oom_error;..  
19400 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f  /* Attempt to co
19410 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 41  mpute the RHS. A
19420 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20  fter this step, 
19430 69 66 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  if anything othe
19440 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49  r than.  ** IN_I
19450 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74  NDEX_NOOP is ret
19460 75 72 6e 65 64 2c 20 74 68 65 20 74 61 62 6c 65  urned, the table
19470 20 6f 70 65 6e 65 64 20 69 74 68 20 63 75 72 73   opened ith curs
19480 6f 72 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  or pExpr->iTable
19490 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   .  ** contains 
194a0 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
194b0 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
194c0 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   If IN_INDEX_NOO
194d0 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20  P is returned,. 
194e0 20 2a 2a 20 74 68 65 20 52 48 53 20 68 61 73 20   ** the RHS has 
194f0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
19500 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50  ed.  */.  v = pP
19510 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
19520 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
19530 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65       /* OOM dete
19540 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  cted prior to th
19550 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
19560 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
19570 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78  (v, "begin IN ex
19580 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d  pr"));.  eType =
19590 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
195a0 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
195b0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195d0 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
195e0 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e  HIP | IN_INDEX_N
195f0 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20  OOP_OK,.        
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19610 20 20 20 20 20 64 65 73 74 49 66 46 61 6c 73 65       destIfFalse
19620 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30  ==destIfNull ? 0
19630 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c   : &rRhsHasNull,
19640 20 61 69 4d 61 70 29 3b 0a 0a 20 20 61 73 73 65   aiMap);..  asse
19650 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
19660 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c   || nVector==1 |
19670 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  | eType==IN_INDE
19680 58 5f 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20  X_EPH.       || 
19690 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
196a0 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79  INDEX_ASC || eTy
196b0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
196c0 45 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69  EX_DESC .  );.#i
196d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
196e0 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74  G.  /* Confirm t
196f0 68 61 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74  hat aiMap[] cont
19700 61 69 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74  ains nVector int
19710 65 67 65 72 20 76 61 6c 75 65 73 20 62 65 74 77  eger values betw
19720 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e  een 0 and.  ** n
19730 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66  Vector-1. */.  f
19740 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
19750 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  r; i++){.    int
19760 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72   j, cnt;.    for
19770 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63  (cnt=j=0; j<nVec
19780 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69  tor; j++) if( ai
19790 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b  Map[j]==i ) cnt+
197a0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  +;.    assert( c
197b0 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e  nt==1 );.  }.#en
197c0 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74  dif..  /* Code t
197d0 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70  he LHS, the <exp
197e0 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
197f0 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68  IN (...)". If th
19800 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a  e LHS is a .  **
19810 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74   vector, then it
19820 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e   is stored in an
19830 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f   array of nVecto
19840 72 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  r registers star
19850 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31  ting .  ** at r1
19860 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69  ..  **.  ** sqli
19870 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29  te3FindInIndex()
19880 20 6d 69 67 68 74 20 68 61 76 65 20 72 65 6f 72   might have reor
19890 64 65 72 65 64 20 74 68 65 20 66 69 65 6c 64 73  dered the fields
198a0 20 6f 66 20 74 68 65 20 4c 48 53 20 76 65 63 74   of the LHS vect
198b0 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  or.  ** so that 
198c0 74 68 65 20 66 69 65 6c 64 73 20 61 72 65 20 69  the fields are i
198d0 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
198e0 20 61 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   as an existing 
198f0 69 6e 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a  index.   The.  *
19900 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20  * aiMap[] array 
19910 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69  contains a mappi
19920 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67  ng from the orig
19930 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f  inal LHS field o
19940 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  rder to.  ** the
19950 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61   field order tha
19960 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 52 48  t matches the RH
19970 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20  S index..  */.  
19980 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19990 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
199a0 72 4c 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43  rLhsOrig = exprC
199b0 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
199c0 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79  , pLeft, &iDummy
199d0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
199e0 6e 56 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70  nVector && aiMap
199f0 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f  [i]==i; i++){} /
19a00 2a 20 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73  * Are LHS fields
19a10 20 72 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20   reordered? */. 
19a20 20 69 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20   if( i==nVector 
19a30 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69  ){.    /* LHS fi
19a40 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f  elds are not reo
19a50 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c  rdered */.    rL
19a60 68 73 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20  hs = rLhsOrig;. 
19a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e   }else{.    /* N
19a80 65 65 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74  eed to reorder t
19a90 68 65 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63  he LHS fields ac
19aa0 63 6f 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70  cording to aiMap
19ab0 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73   */.    rLhs = s
19ac0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
19ad0 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74  ge(pParse, nVect
19ae0 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  or);.    for(i=0
19af0 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
19b00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19b10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19b20 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b  _Copy, rLhsOrig+
19b30 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d  i, rLhs+aiMap[i]
19b40 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
19b50 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33  .  /* If sqlite3
19b60 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69  FindInIndex() di
19b70 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72  d not find or cr
19b80 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68  eate an index th
19b90 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61  at is.  ** suita
19ba0 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ble for evaluati
19bb0 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ng the IN operat
19bc0 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  or, then evaluat
19bd0 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73  e using a.  ** s
19be0 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
19bf0 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a  risons..  **.  *
19c00 2a 20 54 68 69 73 20 69 73 20 73 74 65 70 20 28  * This is step (
19c10 31 29 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65  1) in the in-ope
19c20 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a  rator.md optimiz
19c30 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20  ed algorithm..  
19c40 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
19c50 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b  IN_INDEX_NOOP ){
19c60 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
19c70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
19c80 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53  pList;.    CollS
19c90 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
19ca0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
19cb0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
19cc0 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61  eft);.    int la
19cd0 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  belOk = sqlite3V
19ce0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19cf0 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65 67  .    int r2, reg
19d00 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74 20  ToFree;.    int 
19d10 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20  regCkNull = 0;. 
19d20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 61     int ii;.    a
19d30 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
19d40 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
19d50 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
19d60 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75      if( destIfNu
19d70 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
19d80 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75  ){.      regCkNu
19d90 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ll = sqlite3GetT
19da0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
19db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19dc0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
19dd0 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72 4c 68 73  tAnd, rLhs, rLhs
19de0 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
19df0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
19e00 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ; ii<pList->nExp
19e10 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
19e20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
19e30 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
19e40 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45   pList->a[ii].pE
19e50 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65 29  xpr, &regToFree)
19e60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 43  ;.      if( regC
19e70 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65 33  kNull && sqlite3
19e80 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c  ExprCanBeNull(pL
19e90 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  ist->a[ii].pExpr
19ea0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
19eb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19ec0 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65 67  , OP_BitAnd, reg
19ed0 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43  CkNull, r2, regC
19ee0 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  kNull);.      }.
19ef0 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c 69        if( ii<pLi
19f00 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64  st->nExpr-1 || d
19f10 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
19f20 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
19f30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19f40 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 4c  Op4(v, OP_Eq, rL
19f50 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c  hs, labelOk, r2,
19f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f70 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
19f80 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
19f90 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64  SEQ);.        Vd
19fa0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
19fb0 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  ii<pList->nExpr-
19fc0 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
19fd0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69  CoverageIf(v, ii
19fe0 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  ==pList->nExpr-1
19ff0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a000 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1a010 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20  , zAff[0]);.    
1a020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a030 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66 4e   assert( destIfN
1a040 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65  ull==destIfFalse
1a050 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1a060 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a070 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c 20 64 65   OP_Ne, rLhs, de
1a080 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20  stIfFalse, r2,. 
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
1a0b0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
1a0c0 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  Q); VdbeCoverage
1a0d0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
1a0e0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1a0f0 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51  (v, zAff[0] | SQ
1a100 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1a110 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a120 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a130 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1a140 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a  gToFree);.    }.
1a150 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c      if( regCkNul
1a160 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
1a170 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a180 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b  OP_IsNull, regCk
1a190 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c  Null, destIfNull
1a1a0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a1b0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
1a1c0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
1a1d0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d  tIfFalse);.    }
1a1e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a1f0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1a200 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71  labelOk);.    sq
1a210 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a220 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43  Reg(pParse, regC
1a230 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67 6f 74 6f  kNull);.    goto
1a240 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a250 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d  IN_finished;.  }
1a260 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32 3a 20 43  ..  /* Step 2: C
1a270 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1a280 68 65 20 4c 48 53 20 63 6f 6e 74 61 69 6e 73 20  he LHS contains 
1a290 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  any NULL columns
1a2a0 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 4c  .  If the.  ** L
1a2b0 48 53 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20  HS does contain 
1a2c0 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68 65 20 72  NULLs then the r
1a2d0 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 65 69  esult must be ei
1a2e0 74 68 65 72 20 46 41 4c 53 45 20 6f 72 20 4e 55  ther FALSE or NU
1a2f0 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c  LL..  ** We will
1a300 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 62   then skip the b
1a310 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66 20  inary search of 
1a320 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
1a330 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  if( destIfNull==
1a340 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
1a350 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
1a360 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 65  estIfFalse;.  }e
1a370 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 53 74 65  lse{.    destSte
1a380 70 32 20 3d 20 64 65 73 74 53 74 65 70 36 20 3d  p2 = destStep6 =
1a390 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1a3a0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 0a 20 20  Label(v);.  }.  
1a3b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
1a3c0 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  or; i++){.    Ex
1a3d0 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56  pr *p = sqlite3V
1a3e0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
1a3f0 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  r(pExpr->pLeft, 
1a400 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  i);.    if( sqli
1a410 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
1a420 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  (p) ){.      sql
1a430 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a440 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68  , OP_IsNull, rLh
1a450 73 2b 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b  s+i, destStep2);
1a460 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1a470 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
1a480 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20  }..  /* Step 3. 
1a490 20 54 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20   The LHS is now 
1a4a0 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d  known to be non-
1a4b0 4e 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69  NULL.  Do the bi
1a4c0 6e 61 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a  nary search.  **
1a4d0 20 6f 66 20 74 68 65 20 52 48 53 20 75 73 69 6e   of the RHS usin
1a4e0 67 20 74 68 65 20 4c 48 53 20 61 73 20 61 20 70  g the LHS as a p
1a4f0 72 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c  robe.  If found,
1a500 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20   the result is. 
1a510 20 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20   ** true..  */. 
1a520 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
1a530 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
1a540 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
1a550 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68  e, the RHS is th
1a560 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65  e ROWID of table
1a570 20 62 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77   b-tree and so w
1a580 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e  e also.    ** kn
1a590 6f 77 20 74 68 61 74 20 74 68 65 20 52 48 53 20  ow that the RHS 
1a5a0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65  is non-NULL.  He
1a5b0 6e 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20  nce, we combine 
1a5c0 73 74 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20  steps 3 and 4.  
1a5d0 20 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67    ** into a sing
1a5e0 6c 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  le opcode. */.  
1a5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a600 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
1a610 77 69 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  wid, pExpr->iTab
1a620 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
1a630 20 72 4c 68 73 29 3b 0a 20 20 20 20 56 64 62 65   rLhs);.    Vdbe
1a640 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a650 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73   addrTruthOp = s
1a660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1a670 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f  (v, OP_Goto);  /
1a680 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 2a 2f  * Return True */
1a690 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1a6a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1a6b0 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
1a6c0 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30  rLhs, nVector, 0
1a6d0 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72 29  , zAff, nVector)
1a6e0 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66  ;.    if( destIf
1a6f0 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
1a700 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f  l ){.      /* Co
1a710 6d 62 69 6e 65 20 53 74 65 70 20 33 20 61 6e 64  mbine Step 3 and
1a720 20 53 74 65 70 20 35 20 69 6e 74 6f 20 61 20 73   Step 5 into a s
1a730 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  ingle opcode */.
1a740 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a750 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1a760 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72  _NotFound, pExpr
1a770 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
1a780 46 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 20  False,.         
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29    rLhs, nVector)
1a7b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a7c0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 71  );.      goto sq
1a7d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
1a7e0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
1a7f0 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20      /* Ordinary 
1a800 53 74 65 70 20 33 2c 20 66 6f 72 20 74 68 65 20  Step 3, for the 
1a810 63 61 73 65 20 77 68 65 72 65 20 46 41 4c 53 45  case where FALSE
1a820 20 61 6e 64 20 4e 55 4c 4c 20 61 72 65 20 64 69   and NULL are di
1a830 73 74 69 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64  stinct */.    ad
1a840 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69  drTruthOp = sqli
1a850 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1a860 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
1a870 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 0a  xpr->iTable, 0,.
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63        rLhs, nVec
1a8b0 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  tor); VdbeCovera
1a8c0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
1a8d0 20 53 74 65 70 20 34 2e 20 20 49 66 20 74 68 65   Step 4.  If the
1a8e0 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f   RHS is known to
1a8f0 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64   be non-NULL and
1a900 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69 6e 64   we did not find
1a910 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f  .  ** an match o
1a920 6e 20 74 68 65 20 73 65 61 72 63 68 20 61 62 6f  n the search abo
1a930 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
1a940 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41 4c 53  ult must be FALS
1a950 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 52  E..  */.  if( rR
1a960 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65  hsHasNull && nVe
1a970 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73  ctor==1 ){.    s
1a980 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a990 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
1a9a0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73  rRhsHasNull, des
1a9b0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 56  tIfFalse);.    V
1a9c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a9d0 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35    }..  /* Step 5
1a9e0 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  .  If we do not 
1a9f0 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 64  care about the d
1aa00 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1aa10 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20  n NULL and.  ** 
1aa20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73 74  FALSE, then just
1aa30 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a   return false. .
1aa40 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49    */.  if( destI
1aa50 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
1aa60 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ll ) sqlite3Vdbe
1aa70 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61  Goto(v, destIfFa
1aa80 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70  lse);..  /* Step
1aa90 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   6: Loop through
1aaa0 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52 48 53   rows of the RHS
1aab0 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63 68 20  .  Compare each 
1aac0 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a  row to the LHS..
1aad0 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70    ** If any comp
1aae0 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  arison is NULL, 
1aaf0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1ab00 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c  is NULL.  If all
1ab10 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  .  ** comparison
1ab20 73 20 61 72 65 20 46 41 4c 53 45 20 74 68 65 6e  s are FALSE then
1ab30 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c   the final resul
1ab40 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a  t is FALSE..  **
1ab50 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c  .  ** For a scal
1ab60 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20 73 75  ar LHS, it is su
1ab70 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68 65 63  fficient to chec
1ab80 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  k just the first
1ab90 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65   row.  ** of the
1aba0 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   RHS..  */.  if(
1abb0 20 64 65 73 74 53 74 65 70 36 20 29 20 73 71 6c   destStep6 ) sql
1abc0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1abd0 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74 65 70  abel(v, destStep
1abe0 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20  6);.  addrTop = 
1abf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ac00 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
1ac10 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
1ac20 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 56  estIfFalse);.  V
1ac30 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1ac40 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
1ac50 29 7b 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75  ){.    destNotNu
1ac60 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
1ac70 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1ac80 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f  }else{.    /* Fo
1ac90 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f  r nVector==1, co
1aca0 6d 62 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e  mbine steps 6 an
1acb0 64 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65  d 7 by immediate
1acc0 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20  ly returning.   
1acd0 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65   ** FALSE if the
1ace0 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f   first compariso
1acf0 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  n is not NULL */
1ad00 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  .    destNotNull
1ad10 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   = destIfFalse;.
1ad20 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1ad30 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
1ad40 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
1ad50 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1ad60 0a 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71  .    int r3 = sq
1ad70 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1ad80 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d  pParse);.    p =
1ad90 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
1ada0 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
1adb0 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  , i);.    pColl 
1adc0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1add0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
1ade0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1adf0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1ae00 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  umn, pExpr->iTab
1ae10 6c 65 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20 20  le, i, r3);.    
1ae20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ae30 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73  4(v, OP_Ne, rLhs
1ae40 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c  +i, destNotNull,
1ae50 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
1ae60 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
1ae70 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
1ae80 53 45 51 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  SEQ);.    VdbeCo
1ae90 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1aea0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1aeb0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
1aec0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1aed0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1aee0 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e  Goto, 0, destIfN
1aef0 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65 63  ull);.  if( nVec
1af00 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  tor>1 ){.    sql
1af10 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1af20 61 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e  abel(v, destNotN
1af30 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1af40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1af50 50 5f 4e 65 78 74 2c 20 70 45 78 70 72 2d 3e 69  P_Next, pExpr->i
1af60 54 61 62 6c 65 2c 20 61 64 64 72 54 6f 70 2b 31  Table, addrTop+1
1af70 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1af80 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  age(v);..    /* 
1af90 53 74 65 70 20 37 3a 20 20 49 66 20 77 65 20 72  Step 7:  If we r
1afa0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1afb0 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
1afc0 65 20 72 65 73 75 6c 74 20 6d 75 73 74 0a 20 20  e result must.  
1afd0 20 20 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a    ** be false. *
1afe0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
1aff0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1b000 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c  to, 0, destIfFal
1b010 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  se);.  }..  /* J
1b020 75 6d 70 73 20 68 65 72 65 20 69 6e 20 6f 72 64  umps here in ord
1b030 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75  er to return tru
1b040 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  e. */.  sqlite3V
1b050 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1b060 64 64 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71  ddrTruthOp);..sq
1b070 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
1b080 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20  finished:.  if( 
1b090 72 4c 68 73 21 3d 72 4c 68 73 4f 72 69 67 20 29  rLhs!=rLhsOrig )
1b0a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1b0b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1b0c0 4c 68 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Lhs);.  sqlite3E
1b0d0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1b0e0 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  se);.  VdbeComme
1b0f0 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65  nt((v, "end IN e
1b100 78 70 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45  xpr"));.sqlite3E
1b110 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72  xprCodeIN_oom_er
1b120 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  ror:.  sqlite3Db
1b130 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1b140 20 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74   aiMap);.  sqlit
1b150 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1b160 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65  >db, zAff);.}.#e
1b170 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1b180 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
1b190 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b1a0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1b1b0 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  INT./*.** Genera
1b1c0 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
1b1d0 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
1b1e0 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  the floating poi
1b1f0 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63  nt.** value desc
1b200 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d  ribed by z[0..n-
1b210 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
1b220 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iMem..**.** The
1b230 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c   z[] string will
1b240 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65   probably not be
1b250 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
1b260 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a  .  But the .** z
1b270 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73  [n] character is
1b280 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1b290 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  e something that
1b2a0 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a   does not look.*
1b2b0 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69  * like the conti
1b2c0 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  nuation of the n
1b2d0 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
1b2e0 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56   void codeReal(V
1b2f0 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
1b300 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74  ar *z, int negat
1b310 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  eFlag, int iMem)
1b320 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a  {.  if( ALWAYS(z
1b330 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62  !=0) ){.    doub
1b340 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71  le value;.    sq
1b350 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61  lite3AtoF(z, &va
1b360 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  lue, sqlite3Strl
1b370 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f  en30(z), SQLITE_
1b380 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72  UTF8);.    asser
1b390 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e  t( !sqlite3IsNaN
1b3a0 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68  (value) ); /* Th
1b3b0 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72  e new AtoF never
1b3c0 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a   returns NaN */.
1b3d0 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c      if( negateFl
1b3e0 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61  ag ) value = -va
1b3f0 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  lue;.    sqlite3
1b400 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
1b410 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d  , OP_Real, 0, iM
1b420 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c  em, 0, (u8*)&val
1b430 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20  ue, P4_REAL);.  
1b440 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
1b450 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
1b460 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
1b470 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74  will put the int
1b480 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79  eger describe by
1b490 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d  .** text z[0..n-
1b4a0 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
1b4b0 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70   iMem..**.** Exp
1b4c0 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c  r.u.zToken is al
1b4d0 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65  ways UTF8 and ze
1b4e0 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a  ro-terminated..*
1b4f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
1b500 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20  deInteger(Parse 
1b510 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1b520 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61  Expr, int negFla
1b530 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
1b540 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1b550 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70  ->pVdbe;.  if( p
1b560 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
1b570 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
1b580 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e   int i = pExpr->
1b590 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73  u.iValue;.    as
1b5a0 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20  sert( i>=0 );.  
1b5b0 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
1b5c0 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69  i = -i;.    sqli
1b5d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b5e0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
1b5f0 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iMem);.  }else{.
1b600 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69      int c;.    i
1b610 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f  64 value;.    co
1b620 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45  nst char *z = pE
1b630 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
1b640 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
1b650 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74  );.    c = sqlit
1b660 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
1b670 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  z, &value);.    
1b680 69 66 28 20 28 63 3d 3d 33 20 26 26 20 21 6e 65  if( (c==3 && !ne
1b690 67 46 6c 61 67 29 20 7c 7c 20 28 63 3d 3d 32 29  gFlag) || (c==2)
1b6a0 20 7c 7c 20 28 6e 65 67 46 6c 61 67 20 26 26 20   || (negFlag && 
1b6b0 76 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f  value==SMALLEST_
1b6c0 49 4e 54 36 34 29 29 7b 0a 23 69 66 64 65 66 20  INT64)){.#ifdef 
1b6d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1b6e0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
1b6f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1b700 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69  (pParse, "oversi
1b710 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25  zed integer: %s%
1b720 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d  s", negFlag ? "-
1b730 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73  " : "", z);.#els
1b740 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  e.#ifndef SQLITE
1b750 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45  _OMIT_HEX_INTEGE
1b760 52 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  R.      if( sqli
1b770 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22  te3_strnicmp(z,"
1b780 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20  0x",2)==0 ){.   
1b790 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1b7a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68 65  rMsg(pParse, "he
1b7b0 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69  x literal too bi
1b7c0 67 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61  g: %s%s", negFla
1b7d0 67 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20  g?"-":"",z);.   
1b7e0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
1b7f0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1b800 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e  codeReal(v, z, n
1b810 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20  egFlag, iMem);. 
1b820 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1b830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1b840 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61  f( negFlag ){ va
1b850 6c 75 65 20 3d 20 63 3d 3d 33 20 3f 20 53 4d 41  lue = c==3 ? SMA
1b860 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76  LLEST_INT64 : -v
1b870 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71  alue; }.      sq
1b880 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
1b890 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c  up8(v, OP_Int64,
1b8a0 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38   0, iMem, 0, (u8
1b8b0 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54  *)&value, P4_INT
1b8c0 36 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  64);.    }.  }.}
1b8d0 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 63 6f  ../*.** Erase co
1b8e0 6c 75 6d 6e 2d 63 61 63 68 65 20 65 6e 74 72 79  lumn-cache entry
1b8f0 20 6e 75 6d 62 65 72 20 69 0a 2a 2f 0a 73 74 61   number i.*/.sta
1b900 74 69 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e  tic void cacheEn
1b910 74 72 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a  tryClear(Parse *
1b920 70 50 61 72 73 65 2c 20 69 6e 74 20 69 29 7b 0a  pParse, int i){.
1b930 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
1b940 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52  olCache[i].tempR
1b950 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  eg ){.    if( pP
1b960 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
1b970 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
1b980 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
1b990 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
1b9a0 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
1b9b0 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73  mpReg++] = pPars
1b9c0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
1b9d0 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iReg;.    }.  }.
1b9e0 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61    pParse->nColCa
1b9f0 63 68 65 2d 2d 3b 0a 20 20 69 66 28 20 69 3c 70  che--;.  if( i<p
1ba00 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1ba10 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
1ba20 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70  aColCache[i] = p
1ba30 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1ba40 5b 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  [pParse->nColCac
1ba50 68 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  he];.  }.}.../*.
1ba60 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  ** Record in the
1ba70 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68   column cache th
1ba80 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  at a particular 
1ba90 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a  column from a.**
1baa0 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
1bab0 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
1bac0 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
1bad0 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ster..*/.void sq
1bae0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1baf0 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ore(Parse *pPars
1bb00 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74  e, int iTab, int
1bb10 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29   iCol, int iReg)
1bb20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1bb30 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69   minLru;.  int i
1bb40 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20  dxLru;.  struct 
1bb50 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
1bb60 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72   /* Unless an er
1bb70 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
1bb80 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  , register numbe
1bb90 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f  rs are always po
1bba0 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73  sitive. */.  ass
1bbb0 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70  ert( iReg>0 || p
1bbc0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
1bbd0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1bbe0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73  cFailed );.  ass
1bbf0 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26  ert( iCol>=-1 &&
1bc00 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20   iCol<32768 );  
1bc10 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e  /* Finite column
1bc20 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f   numbers */..  /
1bc30 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c  * The SQLITE_Col
1bc40 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69  umnCache flag di
1bc50 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d  sables the colum
1bc60 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69  n cache.  This i
1bc70 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20  s used.  ** for 
1bc80 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74  testing only - t
1bc90 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51  o verify that SQ
1bca0 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73  Lite always gets
1bcb0 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72   the same answer
1bcc0 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77  .  ** with and w
1bcd0 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d  ithout the colum
1bce0 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  n cache..  */.  
1bcf0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
1bd00 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d  Disabled(pParse-
1bd10 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75  >db, SQLITE_Colu
1bd20 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72  mnCache) ) retur
1bd30 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72  n;..  /* First r
1bd40 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
1bd50 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a  ing entry..  **.
1bd60 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
1bd70 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d  he way the colum
1bd80 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65  n cache is curre
1bd90 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72  ntly used, we ar
1bda0 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a  e guaranteed.  *
1bdb0 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63  * that the objec
1bdc0 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72  t will never alr
1bdd0 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65  eady be in cache
1bde0 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67  .  Verify this g
1bdf0 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23  uarantee..  */.#
1be00 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1be10 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
1be20 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
1be30 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1be40 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
1be50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61    assert( p->iTa
1be60 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e  ble!=iTab || p->
1be70 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b  iColumn!=iCol );
1be80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1be90 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69  * If the cache i
1bea0 73 20 61 6c 72 65 61 64 79 20 66 75 6c 6c 2c 20  s already full, 
1beb0 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61 73 74  delete the least
1bec0 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 65   recently used e
1bed0 6e 74 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 50  ntry */.  if( pP
1bee0 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3e  arse->nColCache>
1bef0 3d 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  =SQLITE_N_COLCAC
1bf00 48 45 20 29 7b 0a 20 20 20 20 6d 69 6e 4c 72 75  HE ){.    minLru
1bf10 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   = 0x7fffffff;. 
1bf20 20 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a     idxLru = -1;.
1bf30 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70      for(i=0, p=p
1bf40 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1bf50 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
1bf60 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
1bf70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6c  {.      if( p->l
1bf80 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20  ru<minLru ){.   
1bf90 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b       idxLru = i;
1bfa0 0a 20 20 20 20 20 20 20 20 6d 69 6e 4c 72 75 20  .        minLru 
1bfb0 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 20 20  = p->lru;.      
1bfc0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  }.    }.    p = 
1bfd0 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
1bfe0 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 7d 65  he[idxLru];.  }e
1bff0 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 26 70 50  lse{.    p = &pP
1c000 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1c010 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1c020 65 2b 2b 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e++];.  }..  /* 
1c030 41 64 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72  Add the new entr
1c040 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  y to the end of 
1c050 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 70  the cache */.  p
1c060 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
1c070 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
1c080 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
1c090 61 62 3b 0a 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e  ab;.  p->iColumn
1c0a0 20 3d 20 69 43 6f 6c 3b 0a 20 20 70 2d 3e 69 52   = iCol;.  p->iR
1c0b0 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 2d 3e  eg = iReg;.  p->
1c0c0 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70  tempReg = 0;.  p
1c0d0 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
1c0e0 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 7d 0a 0a  iCacheCnt++;.}..
1c0f0 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
1c100 68 61 74 20 72 65 67 69 73 74 65 72 73 20 62 65  hat registers be
1c110 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67  tween iReg..iReg
1c120 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e  +nReg-1 are bein
1c130 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a  g overwritten..*
1c140 2a 20 50 75 72 67 65 20 74 68 65 20 72 61 6e 67  * Purge the rang
1c150 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66  e of registers f
1c160 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
1c170 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ache..*/.void sq
1c180 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
1c190 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  move(Parse *pPar
1c1a0 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
1c1b0 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
1c1c0 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
1c1d0 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1c1e0 68 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  he ){.    struct
1c1f0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 20 3d 20   yColCache *p = 
1c200 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
1c210 68 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  he[i];.    if( p
1c220 2d 3e 69 52 65 67 20 3e 3d 20 69 52 65 67 20 26  ->iReg >= iReg &
1c230 26 20 70 2d 3e 69 52 65 67 20 3c 20 69 52 65 67  & p->iReg < iReg
1c240 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63  +nReg ){.      c
1c250 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
1c260 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d  Parse, i);.    }
1c270 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  else{.      i++;
1c280 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1c290 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65  .** Remember the
1c2a0 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20   current column 
1c2b0 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20  cache context.  
1c2c0 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20  Any new entries 
1c2d0 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74  added.** added t
1c2e0 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  o the column cac
1c2f0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61  he after this ca
1c300 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77  ll are removed w
1c310 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  hen the.** corre
1c320 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63  sponding pop occ
1c330 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
1c340 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1c350 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  h(Parse *pParse)
1c360 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  {.  pParse->iCac
1c370 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65  heLevel++;.#ifde
1c380 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1c390 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
1c3a0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1c3b0 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
1c3c0 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 55  {.    printf("PU
1c3d0 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61  SH to %d\n", pPa
1c3e0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1c3f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
1c400 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72  ./*.** Remove fr
1c410 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
1c420 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  che any entries 
1c430 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20  that were added 
1c440 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65  since the.** the
1c450 20 70 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65   previous sqlite
1c460 33 45 78 70 72 43 61 63 68 65 50 75 73 68 20 6f  3ExprCachePush o
1c470 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74  peration.  In ot
1c480 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f  her words, resto
1c490 72 65 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  re.** the cache 
1c4a0 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20  to the state it 
1c4b0 77 61 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65  was in prior the
1c4c0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73   most recent Pus
1c4d0 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
1c4e0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 50  e3ExprCachePop(P
1c4f0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1c500 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 61 73   int i = 0;.  as
1c510 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43  sert( pParse->iC
1c520 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a  acheLevel>=1 );.
1c530 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
1c540 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20  Level--;.#ifdef 
1c550 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
1c560 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
1c570 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
1c580 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
1c590 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20      printf("POP 
1c5a0 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73   to %d\n", pPars
1c5b0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b  e->iCacheLevel);
1c5c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68  .  }.#endif.  wh
1c5d0 69 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e  ile( i<pParse->n
1c5e0 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20  ColCache ){.    
1c5f0 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  if( pParse->aCol
1c600 43 61 63 68 65 5b 69 5d 2e 69 4c 65 76 65 6c 3e  Cache[i].iLevel>
1c610 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c620 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63  vel ){.      cac
1c630 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
1c640 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c  rse, i);.    }el
1c650 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20  se{.      i++;. 
1c660 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1c670 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65 64 20  * When a cached 
1c680 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73 65 64  column is reused
1c690 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
1c6a0 20 69 74 73 20 72 65 67 69 73 74 65 72 20 69 73   its register is
1c6b0 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76  .** no longer av
1c6c0 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74 65 6d  ailable as a tem
1c6d0 70 20 72 65 67 69 73 74 65 72 2e 20 20 74 69 63  p register.  tic
1c6e0 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68 61 74  ket #3879:  that
1c6f0 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65   same.** registe
1c700 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20 74 68  r might be in th
1c710 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c 74 69  e cache in multi
1c720 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f 20 62  ple places, so b
1c730 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74  e sure to.** get
1c740 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74   them all..*/.st
1c750 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
1c760 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
1c770 69 73 74 65 72 28 50 61 72 73 65 20 2a 70 50 61  ister(Parse *pPa
1c780 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  rse, int iReg){.
1c790 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1c7a0 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
1c7b0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
1c7c0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
1c7d0 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1c7e0 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  che; i++, p++){.
1c7f0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d      if( p->iReg=
1c800 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70  =iReg ){.      p
1c810 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
1c820 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47     }.  }.}../* G
1c830 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1c840 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f  t will load into
1c850 20 72 65 67 69 73 74 65 72 20 72 65 67 4f 75 74   register regOut
1c860 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69 73   a value that is
1c870 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
1c880 66 6f 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d  for the iIdxCol-
1c890 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  th column of ind
1c8a0 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64  ex pIdx..*/.void
1c8b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c8c0 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28  LoadIndexColumn(
1c8d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1c8e0 2c 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e  ,  /* The parsin
1c8f0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
1c900 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f  ndex *pIdx,    /
1c910 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73  * The index whos
1c920 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62  e column is to b
1c930 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e  e loaded */.  in
1c940 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
1c950 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
1c960 20 74 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20   to a table row 
1c970 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c  */.  int iIdxCol
1c980 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75  ,    /* The colu
1c990 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  mn of the index 
1c9a0 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a  to be loaded */.
1c9b0 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20    int regOut    
1c9c0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69    /* Store the i
1c9d0 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ndex column valu
1c9e0 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  e in this regist
1c9f0 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69  er */.){.  i16 i
1ca00 54 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61  TabCol = pIdx->a
1ca10 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d  iColumn[iIdxCol]
1ca20 3b 0a 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d  ;.  if( iTabCol=
1ca30 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20  =XN_EXPR ){.    
1ca40 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43  assert( pIdx->aC
1ca50 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73  olExpr );.    as
1ca60 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c  sert( pIdx->aCol
1ca70 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78  Expr->nExpr>iIdx
1ca80 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73  Col );.    pPars
1ca90 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54  e->iSelfTab = iT
1caa0 61 62 43 75 72 20 2b 20 31 3b 0a 20 20 20 20 73  abCur + 1;.    s
1cab0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
1cac0 70 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  py(pParse, pIdx-
1cad0 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64  >aColExpr->a[iId
1cae0 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67  xCol].pExpr, reg
1caf0 4f 75 74 29 3b 0a 20 20 20 20 70 50 61 72 73 65  Out);.    pParse
1cb00 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a  ->iSelfTab = 0;.
1cb10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1cb20 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1cb30 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61  olumnOfTable(pPa
1cb40 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78  rse->pVdbe, pIdx
1cb50 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75  ->pTable, iTabCu
1cb60 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
1cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb80 20 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20         iTabCol, 
1cb90 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  regOut);.  }.}..
1cba0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1cbb0 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74  ode to extract t
1cbc0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1cbd0 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
1cbe0 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  f a table..*/.vo
1cbf0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1cc00 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1cc10 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  le(.  Vdbe *v,  
1cc20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1cc30 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  E under construc
1cc40 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20  tion */.  Table 
1cc50 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65  *pTab,    /* The
1cc60 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1cc70 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20  g the value */. 
1cc80 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
1cc90 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75   /* The table cu
1cca0 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b  rsor.  Or the PK
1ccb0 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48   cursor for WITH
1ccc0 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69  OUT ROWID */.  i
1ccd0 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f  nt iCol,       /
1cce0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
1ccf0 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
1cd00 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
1cd10 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
1cd20 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20   the value into 
1cd30 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
1cd40 0a 29 7b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  .){.  if( pTab==
1cd50 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1cd60 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1cd70 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72  _Column, iTabCur
1cd80 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  , iCol, regOut);
1cd90 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1cda0 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c  .  if( iCol<0 ||
1cdb0 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
1cdc0 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
1cdd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cde0 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72  P_Rowid, iTabCur
1cdf0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
1ce00 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d  se{.    int op =
1ce10 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
1ce20 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20   ? OP_VColumn : 
1ce30 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  OP_Column;.    i
1ce40 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  nt x = iCol;.   
1ce50 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
1ce60 54 61 62 29 20 26 26 20 21 49 73 56 69 72 74 75  Tab) && !IsVirtu
1ce70 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
1ce80 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c    x = sqlite3Col
1ce90 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74  umnOfIndex(sqlit
1cea0 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
1ceb0 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a  x(pTab), iCol);.
1cec0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1ced0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
1cee0 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72  p, iTabCur, x, r
1cef0 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66  egOut);.  }.  if
1cf00 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
1cf10 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
1cf20 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
1cf30 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1cf40 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1cf50 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1cf60 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69  ll extract the i
1cf70 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e  Column-th column
1cf80 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70   from.** table p
1cf90 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68  Tab and store th
1cfa0 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1cfb0 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a  n a register. .*
1cfc0 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69  *.** An effort i
1cfd0 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
1cfe0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
1cff0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1d000 67 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e  g.  This.** is n
1d010 6f 74 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f  ot garanteeed fo
1d020 72 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20  r GetColumn() - 
1d030 74 68 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62  the result can b
1d040 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61  e stored in.** a
1d050 6e 79 20 72 65 67 69 73 74 65 72 2e 20 20 42 75  ny register.  Bu
1d060 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  t the result is 
1d070 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61  guaranteed to la
1d080 6e 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  nd in register i
1d090 52 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f  Reg.** for GetCo
1d0a0 6c 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a  lumnToReg()..**.
1d0b0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
1d0c0 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
1d0d0 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c  to pTab in iTabl
1d0e0 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
1d0f0 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
1d100 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20  .  If iColumn<0 
1d110 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e  then code is gen
1d120 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72  erated that extr
1d130 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a  acts the rowid..
1d140 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1d150 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1d160 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1d170 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
1d180 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1d190 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1d1a0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1d1b0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1d1c0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
1d1d0 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
1d1e0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
1d1f0 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
1d200 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1d210 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
1d220 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
1d230 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
1d240 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
1d250 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20  .  int iReg,    
1d260 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
1d270 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75  ults here */.  u
1d280 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20  8 p5            
1d290 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20  /* P5 value for 
1d2a0 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47  OP_Column + FLAG
1d2b0 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  S */.){.  Vdbe *
1d2c0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1d2d0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1d2e0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1d2f0 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
1d300 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1d310 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
1d320 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
1d330 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
1d340 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26  Table==iTable &&
1d350 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f   p->iColumn==iCo
1d360 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d  lumn ){.      p-
1d370 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
1d380 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
1d390 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1d3a0 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 70 50  hePinRegister(pP
1d3b0 61 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a  arse, p->iReg);.
1d3c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e        return p->
1d3d0 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  iReg;.    }.  } 
1d3e0 20 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30   .  assert( v!=0
1d3f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1d400 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
1d410 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69  Table(v, pTab, i
1d420 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
1d430 69 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20  iReg);.  if( p5 
1d440 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1d450 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35  beChangeP5(v, p5
1d460 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20  );.  }else{   . 
1d470 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1d480 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
1d490 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
1d4a0 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72  , iReg);.  }.  r
1d4b0 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f  eturn iReg;.}.vo
1d4c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1d4d0 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67  deGetColumnToReg
1d4e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1d4f0 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e,   /* Parsing 
1d500 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1d510 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d520 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
1d530 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1d540 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
1d550 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f   are reading fro
1d560 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  m */.  int iColu
1d570 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  mn,     /* Index
1d580 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
1d590 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54  lumn */.  int iT
1d5a0 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  able,      /* Th
1d5b0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
1d5c0 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  g to the table *
1d5d0 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20  /.  int iReg    
1d5e0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65       /* Store re
1d5f0 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
1d600 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69  .  int r1 = sqli
1d610 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1d620 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61  lumn(pParse, pTa
1d630 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62  b, iColumn, iTab
1d640 6c 65 2c 20 69 52 65 67 2c 20 30 29 3b 0a 20 20  le, iReg, 0);.  
1d650 69 66 28 20 72 31 21 3d 69 52 65 67 20 29 20 73  if( r1!=iReg ) s
1d660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d670 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1d680 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 69 52  OP_SCopy, r1, iR
1d690 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  eg);.}.../*.** C
1d6a0 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20  lear all column 
1d6b0 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a  cache entries..*
1d6c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1d6d0 70 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72  prCacheClear(Par
1d6e0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
1d6f0 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51  nt i;..#ifdef SQ
1d700 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1d710 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
1d720 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
1d730 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
1d740 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c    printf("CLEAR\
1d750 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n");.  }.#endif.
1d760 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
1d770 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
1d780 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
1d790 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1d7a0 69 5d 2e 74 65 6d 70 52 65 67 0a 20 20 20 20 20  i].tempReg.     
1d7b0 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
1d7c0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
1d7d0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 0a  arse->aTempReg).
1d7e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 70 50      ){.       pP
1d7f0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
1d800 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
1d810 2b 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  +] = pParse->aCo
1d820 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a  lCache[i].iReg;.
1d830 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
1d840 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20  se->nColCache = 
1d850 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  0;.}../*.** Reco
1d860 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
1d870 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61   an affinity cha
1d880 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  nge has occurred
1d890 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65   on iCount.** re
1d8a0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
1d8b0 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f   with iStart..*/
1d8c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1d8d0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1d8e0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
1d8f0 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20  se, int iStart, 
1d900 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73  int iCount){.  s
1d910 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
1d920 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53  emove(pParse, iS
1d930 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d  tart, iCount);.}
1d940 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1d950 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f   code to move co
1d960 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73  ntent from regis
1d970 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72  ters iFrom...iFr
1d980 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65  om+nReg-1.** ove
1d990 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52  r to iTo..iTo+nR
1d9a0 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63  eg-1. Keep the c
1d9b0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74  olumn cache up-t
1d9c0 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  o-date..*/.void 
1d9d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
1d9e0 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
1d9f0 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
1da00 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29  t iTo, int nReg)
1da10 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f  {.  assert( iFro
1da20 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69  m>=iTo+nReg || i
1da30 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29  From+nReg<=iTo )
1da40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1da50 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56  ddOp3(pParse->pV
1da60 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46  dbe, OP_Move, iF
1da70 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b  rom, iTo, nReg);
1da80 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1da90 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1daa0 2c 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a  , iFrom, nReg);.
1dab0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
1dac0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1dad0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
1dae0 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a  OVERAGE_TEST)./*
1daf0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1db00 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20  if any register 
1db10 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72  in the range iFr
1db20 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69  om..iTo (inclusi
1db30 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61  ve).** is used a
1db40 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f  s part of the co
1db50 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  lumn cache..**.*
1db60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1db70 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 73  s used within as
1db80 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63  sert() and testc
1db90 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c  ase() macros onl
1dba0 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f  y.** and does no
1dbb0 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f  t appear in a no
1dbc0 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  rmal build..*/.s
1dbd0 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73  tatic int usedAs
1dbe0 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73  ColumnCache(Pars
1dbf0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1dc00 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
1dc10 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1dc20 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
1dc30 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
1dc40 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
1dc50 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1dc60 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  che; i++, p++){.
1dc70 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69      int r = p->i
1dc80 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d  Reg;.    if( r>=
1dc90 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20  iFrom && r<=iTo 
1dca0 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f  ) return 1;    /
1dcb0 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20  *NO_TEST*/.  }. 
1dcc0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1dcd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
1dce0 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f  BUG || SQLITE_CO
1dcf0 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a  VERAGE_TEST */..
1dd00 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1dd10 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
1dd20 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f  on node to a TK_
1dd30 52 45 47 49 53 54 45 52 20 72 65 66 65 72 65 6e  REGISTER referen
1dd40 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65 72  cing.** register
1dd50 20 69 52 65 67 2e 20 20 54 68 65 20 63 61 6c 6c   iReg.  The call
1dd60 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
1dd70 68 61 74 20 69 52 65 67 20 61 6c 72 65 61 64 79  hat iReg already
1dd80 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
1dd90 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
1dda0 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
1ddb0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1ddc0 64 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72  d exprToRegister
1ddd0 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52  (Expr *p, int iR
1dde0 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20  eg){.  p->op2 = 
1ddf0 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d  p->op;.  p->op =
1de00 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
1de10 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67  p->iTable = iReg
1de20 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f  ;.  ExprClearPro
1de30 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70  perty(p, EP_Skip
1de40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c  );.}../*.** Eval
1de50 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
1de60 6f 6e 20 28 65 69 74 68 65 72 20 61 20 76 65 63  on (either a vec
1de70 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72 20  tor or a scalar 
1de80 65 78 70 72 65 73 73 69 6f 6e 29 20 61 6e 64 20  expression) and 
1de90 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65 73  store.** the res
1dea0 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f  ult in continguo
1deb0 75 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  us temporary reg
1dec0 69 73 74 65 72 73 2e 20 20 52 65 74 75 72 6e 20  isters.  Return 
1ded0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
1dee0 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
1def0 65 72 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  er used to store
1df00 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
1df10 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
1df20 65 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  ed result regist
1df30 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
1df40 79 20 73 63 61 6c 61 72 2c 20 74 68 65 6e 20 61  y scalar, then a
1df50 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74 68 61  lso write.** tha
1df60 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
1df70 72 20 69 6e 74 6f 20 2a 70 69 46 72 65 65 61 62  r into *piFreeab
1df80 6c 65 2e 20 20 49 66 20 74 68 65 20 72 65 74 75  le.  If the retu
1df90 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67 69  rned result regi
1dfa0 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61  ster.** is not a
1dfb0 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 66   temporary or if
1dfc0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1dfd0 69 73 20 61 20 76 65 63 74 6f 72 20 73 65 74 20  is a vector set 
1dfe0 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74  *piFreeable.** t
1dff0 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  o 0..*/.static i
1e000 6e 74 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  nt exprCodeVecto
1e010 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1e020 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70   Expr *p, int *p
1e030 69 46 72 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e  iFreeable){.  in
1e040 74 20 69 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74  t iResult;.  int
1e050 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   nResult = sqlit
1e060 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
1e070 28 70 29 3b 0a 20 20 69 66 28 20 6e 52 65 73 75  (p);.  if( nResu
1e080 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 52 65  lt==1 ){.    iRe
1e090 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  sult = sqlite3Ex
1e0a0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e0b0 65 2c 20 70 2c 20 70 69 46 72 65 65 61 62 6c 65  e, p, piFreeable
1e0c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e0d0 2a 70 69 46 72 65 65 61 62 6c 65 20 3d 20 30 3b  *piFreeable = 0;
1e0e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
1e0f0 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 23 69 66  TK_SELECT ){.#if
1e100 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1e110 51 55 45 52 59 0a 20 20 20 20 20 20 69 52 65 73  QUERY.      iRes
1e120 75 6c 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  ult = 0;.#else. 
1e130 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73       iResult = s
1e140 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
1e150 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 30  ect(pParse, p, 0
1e160 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
1e170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1e180 74 20 69 3b 0a 20 20 20 20 20 20 69 52 65 73 75  t i;.      iResu
1e190 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  lt = pParse->nMe
1e1a0 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  m+1;.      pPars
1e1b0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
1e1c0 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  lt;.      for(i=
1e1d0 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b  0; i<nResult; i+
1e1e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
1e1f0 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
1e200 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 2d  rable(pParse, p-
1e210 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
1e220 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29  Expr, i+iResult)
1e230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e240 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
1e250 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  sult;.}.../*.** 
1e260 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
1e270 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
1e280 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
1e290 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
1e2a0 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70  ression.  Attemp
1e2b0 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  t to store the r
1e2c0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
1e2d0 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20  er "target"..** 
1e2e0 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
1e2f0 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74  ter where result
1e300 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  s are stored..**
1e310 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f  .** With this ro
1e320 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20  utine, there is 
1e330 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  no guarantee tha
1e340 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a  t results will.*
1e350 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  * be stored in t
1e360 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
1e370 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72  lt might be stor
1e380 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ed in some other
1e390 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20  .** register if 
1e3a0 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74  it is convenient
1e3b0 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20   to do so.  The 
1e3c0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1e3d0 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74  .** must check t
1e3e0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
1e3f0 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75  nd move the resu
1e400 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72  lts to the desir
1e410 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a  ed.** register..
1e420 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1e430 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72  prCodeTarget(Par
1e440 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1e450 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
1e460 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
1e470 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1e480 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65    /* The VM unde
1e490 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1e4a0 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e4c0 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
1e4d0 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
1e4e0 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
1e4f0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1e500 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
1e510 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20  ster inReg */.  
1e520 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
1e530 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
1e540 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
1e550 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
1e560 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
1e570 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20  egFree2 = 0;    
1e580 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
1e590 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
1e5a0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1e5b0 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   */.  int r1, r2
1e5c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e5d0 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73  /* Various regis
1e5e0 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20  ter numbers */. 
1e5f0 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20   Expr tempX;    
1e600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1e610 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69  mporary expressi
1e620 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  on node */.  int
1e630 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65   p5 = 0;..  asse
1e640 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
1e650 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
1e660 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d  nMem );.  if( v=
1e670 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1e680 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
1e690 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1e6a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1e6b0 0a 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65  .expr_code_doove
1e6c0 72 3a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  r:.  if( pExpr==
1e6d0 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
1e6e0 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
1e6f0 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
1e700 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
1e710 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1e720 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
1e730 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1e740 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
1e750 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
1e760 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1e770 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
1e780 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
1e790 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
1e7a0 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
1e7b0 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
1e7c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1e7d0 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
1e7e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
1e7f0 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
1e800 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
1e810 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
1e820 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
1e830 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1e840 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
1e850 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
1e860 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  xPTab,.         
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1e890 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
1e8a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1e8b0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  n target;.      
1e8c0 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
1e8d0 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
1e8e0 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
1e8f0 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
1e900 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1e910 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
1e920 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69   iTab = pExpr->i
1e930 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28  Table;.      if(
1e940 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20   iTab<0 ){.     
1e950 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69     if( pParse->i
1e960 53 65 6c 66 54 61 62 3c 30 20 29 7b 0a 20 20 20  SelfTab<0 ){.   
1e970 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
1e980 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74  ting CHECK const
1e990 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74  raints or insert
1e9a0 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c  ing into partial
1e9b0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
1e9c0 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
1e9d0 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72  ->iColumn - pPar
1e9e0 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20  se->iSelfTab;.  
1e9f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ea00 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67         /* Coding
1ea10 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
1ea20 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
1ea30 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f  n index where co
1ea40 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20  lumn names.     
1ea50 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
1ea60 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20 74 68  ndex refer to th
1ea70 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68  e table to which
1ea80 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
1ea90 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  gs */.          
1eaa0 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69  iTab = pParse->i
1eab0 53 65 6c 66 54 61 62 20 2d 20 31 3b 0a 20 20 20  SelfTab - 1;.   
1eac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ead0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1eae0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1eaf0 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
1eb00 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20  pr->pTab,.      
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 70 45 78 70 72 2d 3e           pExpr->
1eb30 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74  iColumn, iTab, t
1eb40 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32        pExpr->op2
1eb70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
1eb80 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
1eb90 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
1eba0 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
1ebb0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1ebc0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1ebd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ebe0 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3a 20 7b   TK_TRUEFALSE: {
1ebf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ec00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1ec10 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33 45  nteger, sqlite3E
1ec20 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45  xprTruthValue(pE
1ec30 78 70 72 29 2c 20 74 61 72 67 65 74 29 3b 0a 20  xpr), target);. 
1ec40 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1ec50 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  et;.    }.#ifnde
1ec60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1ec70 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1ec80 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
1ec90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1eca0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1ecb0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1ecc0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f  lue) );.      co
1ecd0 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d  deReal(v, pExpr-
1ece0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61  >u.zToken, 0, ta
1ecf0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1ed00 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1ed10 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1ed20 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
1ed30 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1ed40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ed50 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1ed60 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
1ed70 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
1ed80 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70  (v, target, pExp
1ed90 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1eda0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1edb0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
1edc0 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
1edd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ede0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1edf0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1ee00 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1ee10 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1ee20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
1ee30 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
1ee40 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
1ee50 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1ee60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
1ee70 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
1ee80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ee90 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1eea0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1eeb0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1eec0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1eed0 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
1eee0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1eef0 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
1ef00 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1ef10 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
1ef20 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
1ef30 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
1ef40 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
1ef50 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1ef60 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
1ef70 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
1ef80 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
1ef90 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
1efa0 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
1efb0 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
1efc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1efd0 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
1efe0 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
1eff0 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
1f000 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f010 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65  target;.    }.#e
1f020 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
1f030 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
1f040 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1f050 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1f060 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1f070 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f080 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1f090 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1f0a0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1f0b0 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  oken[0]!=0 );.  
1f0c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f0d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69  ddOp2(v, OP_Vari
1f0e0 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f  able, pExpr->iCo
1f0f0 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
1f100 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1f110 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29  u.zToken[1]!=0 )
1f120 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1f130 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
1f140 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28  3VListNumToName(
1f150 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20  pParse->pVList, 
1f160 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
1f170 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f180 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1f190 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63  [0]=='?' || strc
1f1a0 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
1f1b0 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20  en, z)==0 );.   
1f1c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c       pParse->pVL
1f1d0 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49  ist[0] = 0; /* I
1f1e0 6e 64 69 63 61 74 65 20 56 4c 69 73 74 20 6d 61  ndicate VList ma
1f1f0 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65  y no longer be e
1f200 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20 20 20  nlarged */.     
1f210 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
1f220 70 65 6e 64 50 34 28 76 2c 20 28 63 68 61 72 2a  pendP4(v, (char*
1f230 29 7a 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  )z, P4_STATIC);.
1f240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1f250 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1f260 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
1f270 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
1f280 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69   return pExpr->i
1f290 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66  Table;.    }.#if
1f2a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f2b0 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
1f2c0 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
1f2d0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
1f2e0 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
1f2f0 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
1f300 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65  n) */.      inRe
1f310 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1f320 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1f330 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f340 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
1f350 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
1f360 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f370 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f380 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
1f390 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f3a0 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
1f3b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1f3c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f3d0 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74  p2(v, OP_Cast, t
1f3e0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1f400 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
1f410 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
1f420 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74  en, 0));.      t
1f430 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43  estcase( usedAsC
1f440 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
1f450 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29  e, inReg, inReg)
1f460 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f470 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1f480 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1f490 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20   inReg, 1);.    
1f4a0 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
1f4b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1f4c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
1f4d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1f4e0 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1f4f0 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20  ISNOT:.      op 
1f500 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
1f510 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
1f520 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45       p5 = SQLITE
1f530 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
1f540 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a  * fall-through *
1f550 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
1f560 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1f570 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1f580 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1f590 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1f5a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1f5b0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
1f5c0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
1f5d0 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Left;.      if( 
1f5e0 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
1f5f0 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20  tor(pLeft) ){.  
1f600 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72        codeVector
1f610 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1f620 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f  pExpr, target, o
1f630 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65  p, p5);.      }e
1f640 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
1f650 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f660 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
1f670 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f680 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
1f690 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f6a0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f6b0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1f6c0 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  e2);.        cod
1f6d0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1f6e0 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70   pLeft, pExpr->p
1f6f0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1f700 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
1f710 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
1f720 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20  REP2 | p5);.    
1f730 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
1f740 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
1f750 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
1f760 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f770 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
1f780 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
1f790 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
1f7a0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
1f7b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f7c0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
1f7d0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
1f7e0 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
1f7f0 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
1f800 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f810 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
1f820 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
1f830 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
1f840 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
1f850 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f860 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
1f870 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
1f880 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
1f890 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
1f8a0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f8b0 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1f8c0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
1f8d0 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
1f8e0 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
1f8f0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f900 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
1f910 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f920 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1f930 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f940 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1f950 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1f960 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f970 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
1f980 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
1f990 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
1f9a0 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
1f9b0 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
1f9c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
1f9d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
1f9e0 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
1f9f0 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
1fa00 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
1fa10 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
1fa20 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
1fa30 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
1fa40 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
1fa50 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
1fa60 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20  =OP_And );      
1fa70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fa80 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20  op==TK_AND );.  
1fa90 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
1faa0 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20  R==OP_Or );     
1fab0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1fac0 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  e( op==TK_OR );.
1fad0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1fae0 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
1faf0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1fb00 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53  ase( op==TK_PLUS
1fb10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1fb20 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
1fb30 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74  ubtract );     t
1fb40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fb50 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61  MINUS );.      a
1fb60 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f  ssert( TK_REM==O
1fb70 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20  P_Remainder );  
1fb80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1fb90 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20  ==TK_REM );.    
1fba0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1fbb0 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
1fbc0 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1fbd0 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
1fbe0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fbf0 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
1fc00 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73  Or );        tes
1fc10 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1fc20 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  TOR );.      ass
1fc30 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
1fc40 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20  P_Divide );     
1fc50 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fc60 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20  TK_SLASH );.    
1fc70 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
1fc80 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
1fc90 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  t );   testcase(
1fca0 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29   op==TK_LSHIFT )
1fcb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fcc0 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
1fcd0 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73  iftRight );  tes
1fce0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53  tcase( op==TK_RS
1fcf0 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
1fd00 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
1fd10 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20  =OP_Concat );   
1fd20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1fd30 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20  =TK_CONCAT );.  
1fd40 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1fd50 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1fd60 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1fd70 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1fd80 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1fd90 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1fda0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1fdb0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1fdc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1fdd0 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
1fde0 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1fdf0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fe00 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1fe10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fe20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1fe30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fe40 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
1fe50 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
1fe60 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
1fe70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
1fe80 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
1fe90 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
1fea0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
1feb0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1fec0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
1fed0 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74  pLeft, 1, target
1fee0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1fef0 6e 20 74 61 72 67 65 74 3b 0a 23 69 66 6e 64 65  n target;.#ifnde
1ff00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1ff10 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1ff20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
1ff30 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
1ff40 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1ff50 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1ff60 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1ff70 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1ff80 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1ff90 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pLeft->u.zToken,
1ffa0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1ffb0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1ffc0 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  et;.#endif.     
1ffd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ffe0 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e  tempX.op = TK_IN
1fff0 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74  TEGER;.        t
20000 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f  empX.flags = EP_
20010 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65  IntValue|EP_Toke
20020 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74  nOnly;.        t
20030 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20  empX.u.iValue = 
20040 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  0;.        r1 = 
20050 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20060 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d  emp(pParse, &tem
20070 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pX, &regFree1);.
20080 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
20090 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
200a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
200b0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32  pLeft, &regFree2
200c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
200d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
200e0 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c  OP_Subtract, r2,
200f0 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
20100 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20110 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
20120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
20130 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20140 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
20150 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
20160 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
20170 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
20180 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  Not );   testcas
20190 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54  e( op==TK_BITNOT
201a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
201b0 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
201c0 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74   );         test
201d0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
201e0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
201f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
20200 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
20210 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
20220 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
20230 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
20240 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
20250 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
20260 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
20270 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20280 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
20290 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UTH: {.      int
202a0 20 69 73 54 72 75 65 3b 20 20 20 20 2f 2a 20 49   isTrue;    /* I
202b0 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54  S TRUE or IS NOT
202c0 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 69   TRUE */.      i
202d0 6e 74 20 62 4e 6f 72 6d 61 6c 3b 20 20 20 2f 2a  nt bNormal;   /*
202e0 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 46   IS TRUE or IS F
202f0 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 72 31  ALSE */.      r1
20300 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
20310 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
20320 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
20330 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
20340 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20350 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73  1==0 );.      is
20360 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78  True = sqlite3Ex
20370 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78  prTruthValue(pEx
20380 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
20390 20 20 20 62 4e 6f 72 6d 61 6c 20 3d 20 70 45 78     bNormal = pEx
203a0 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 3b 0a  pr->op2==TK_IS;.
203b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
203c0 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61  isTrue && bNorma
203d0 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
203e0 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20 62  se( !isTrue && b
203f0 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 73  Normal);.      s
20400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20410 49 6e 74 28 76 2c 20 4f 50 5f 49 73 54 72 75 65  Int(v, OP_IsTrue
20420 2c 20 72 31 2c 20 69 6e 52 65 67 2c 20 21 69 73  , r1, inReg, !is
20430 54 72 75 65 2c 20 69 73 54 72 75 65 20 5e 20 62  True, isTrue ^ b
20440 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 62  Normal);.      b
20450 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
20460 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
20470 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
20480 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
20490 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73   addr;.      ass
204a0 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
204b0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
204c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
204d0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
204e0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
204f0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
20500 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
20510 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
20520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20530 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
20540 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
20550 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
20560 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
20570 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20580 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
20590 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
205a0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
205b0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
205c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
205d0 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
205e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
205f0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
20600 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
20610 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
20620 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
20630 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20640 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
20650 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  er, 0, target);.
20660 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20670 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
20680 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
20690 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
206a0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
206b0 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
206c0 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d   *pInfo = pExpr-
206d0 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
206e0 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b   if( pInfo==0 ){
206f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20700 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
20710 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
20720 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
20730 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20740 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
20750 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
20760 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  s()", pExpr->u.z
20770 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
20780 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
20790 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  urn pInfo->aFunc
207a0 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d  [pExpr->iAgg].iM
207b0 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
207c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
207d0 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
207e0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
207f0 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
20800 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
20810 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
20820 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
20830 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  Farg;           
20840 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
20850 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
20860 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44  s */.      FuncD
20870 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20  ef *pDef;       
20880 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
20890 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a  n definition obj
208a0 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ect */.      con
208b0 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
208c0 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
208d0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
208e0 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20    u32 constMask 
208f0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b  = 0;     /* Mask
20900 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
20910 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  uments that are 
20920 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20  constant */.    
20930 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
20940 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
20950 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
20960 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20970 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
20980 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
20990 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  nection */.     
209a0 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
209b0 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  );      /* The t
209c0 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65  ext encoding use
209d0 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  d by this databa
209e0 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c  se */.      Coll
209f0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20  Seq *pColl = 0; 
20a00 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e     /* A collatin
20a10 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
20a20 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
20a30 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
20a40 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
20a50 5f 52 65 64 75 63 65 64 29 20 26 26 20 70 45 78  _Reduced) && pEx
20a60 70 72 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20  pr->pWin ){.    
20a70 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
20a80 2d 3e 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  ->pWin->regResul
20a90 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
20aa0 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f    if( ConstFacto
20ab0 72 4f 6b 28 70 50 61 72 73 65 29 20 26 26 20 73  rOk(pParse) && s
20ac0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
20ad0 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
20ae0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
20af0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63   SQL functions c
20b00 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e  an be expensive.
20b10 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20   So try to move 
20b20 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f  constant functio
20b30 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  ns.        ** ou
20b40 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  t of the inner l
20b50 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61  oop, even if tha
20b60 74 20 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61  t means an extra
20b70 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20   OP_Copy. */.   
20b80 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
20b90 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
20ba0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
20bb0 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -1);.      }.  
20bc0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
20bd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20be0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
20bf0 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  ) );.      if( E
20c00 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20c10 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
20c20 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ly) ){.        p
20c30 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Farg = 0;.      
20c40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
20c50 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Farg = pExpr->x.
20c60 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
20c70 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61       nFarg = pFa
20c80 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70  rg ? pFarg->nExp
20c90 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73  r : 0;.      ass
20ca0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
20cb0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
20cc0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
20cd0 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
20ce0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
20cf0 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
20d00 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
20d10 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  Id, nFarg, enc, 
20d20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0);.#ifdef SQLIT
20d30 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e  E_ENABLE_UNKNOWN
20d40 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20  _SQL_FUNCTION.  
20d50 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
20d60 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  && pParse->expla
20d70 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  in ){.        pD
20d80 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
20d90 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e  Function(db, "un
20da0 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65  known", nFarg, e
20db0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nc, 0);.      }.
20dc0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
20dd0 20 70 44 65 66 3d 3d 30 20 2f 2a 20 7c 7c 20 70   pDef==0 /* || p
20de0 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d  Def->xFinalize!=
20df0 30 20 2a 2f 20 29 7b 0a 20 20 20 20 20 20 20 20  0 */ ){.        
20e00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20e10 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
20e20 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22   function: %s()"
20e30 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
20e40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
20e50 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
20e60 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d   a direct implem
20e70 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
20e80 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43  built-in COALESC
20e90 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  E() and.      **
20ea0 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69   IFNULL() functi
20eb0 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64  ons.  This avoid
20ec0 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76  s unnecessary ev
20ed0 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20  aluation of.    
20ee0 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70    ** arguments p
20ef0 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f  ast the first no
20f00 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  n-NULL argument.
20f10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20f20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
20f30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
20f40 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
20f50 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
20f60 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
20f70 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20f80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20f90 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20   nFarg>=2 );.   
20fa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20fb0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
20fc0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
20fd0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
20fe0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72   for(i=1; i<nFar
20ff0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
21000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21010 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
21020 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43  ll, target, endC
21030 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
21040 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
21050 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
21060 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
21070 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61  emove(pParse, ta
21080 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rget, 1);.      
21090 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
210a0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
210b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
210c0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
210d0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
210e0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
210f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21100 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
21110 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  arse);.        }
21120 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21130 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
21140 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  (v, endCoalesce)
21150 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
21160 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
21170 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28  /* The UNLIKELY(
21180 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  ) function is a 
21190 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75  no-op.  The resu
211a0 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a  lt is the value.
211b0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
211c0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
211d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
211e0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
211f0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
21200 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20  _UNLIKELY ){.   
21210 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
21220 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg>=1 );.       
21230 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
21240 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
21250 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
21260 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
21270 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65  ;.      }..#ifde
21280 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21290 20 20 20 20 20 2f 2a 20 54 68 65 20 41 46 46 49       /* The AFFI
212a0 4e 49 54 59 28 29 20 66 75 6e 63 74 69 6f 6e 20  NITY() function 
212b0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 20 73  evaluates to a s
212c0 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
212d0 69 62 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  ibes.      ** th
212e0 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  e type affinity 
212f0 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  of the argument.
21300 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
21310 6f 72 20 74 65 73 74 69 6e 67 20 6f 66 0a 20 20  or testing of.  
21320 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74      ** the SQLit
21330 65 20 74 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20  e type logic..  
21340 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
21350 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
21360 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41   & SQLITE_FUNC_A
21370 46 46 49 4e 49 54 59 20 29 7b 0a 20 20 20 20 20  FFINITY ){.     
21380 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
21390 7a 41 66 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62  zAff[] = { "blob
213a0 22 2c 20 22 74 65 78 74 22 2c 20 22 6e 75 6d 65  ", "text", "nume
213b0 72 69 63 22 2c 20 22 69 6e 74 65 67 65 72 22 2c  ric", "integer",
213c0 20 22 72 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20   "real" };.     
213d0 20 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 20     char aff;.   
213e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
213f0 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg==1 );.       
21400 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78   aff = sqlite3Ex
21410 70 72 41 66 66 69 6e 69 74 79 28 70 46 61 72 67  prAffinity(pFarg
21420 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
21430 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21440 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
21450 74 61 72 67 65 74 2c 20 0a 20 20 20 20 20 20 20  target, .       
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21470 20 20 20 20 20 20 20 61 66 66 20 3f 20 61 7a 41         aff ? azA
21480 66 66 5b 61 66 66 2d 53 51 4c 49 54 45 5f 41 46  ff[aff-SQLITE_AF
21490 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f 6e 65 22  F_BLOB] : "none"
214a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
214b0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  n target;.      
214c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
214d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67  for(i=0; i<nFarg
214e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
214f0 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69  if( i<32 && sqli
21500 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
21510 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  t(pFarg->a[i].pE
21520 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
21530 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33    testcase( i==3
21540 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
21550 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  onstMask |= MASK
21560 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20  BIT32(i);.      
21570 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
21580 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
21590 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
215a0 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21  EEDCOLL)!=0 && !
215b0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
215c0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
215d0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
215e0 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
215f0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
21600 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21610 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20    if( pFarg ){. 
21620 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74         if( const
21630 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  Mask ){.        
21640 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e    r1 = pParse->n
21650 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  Mem+1;.         
21660 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
21670 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20   nFarg;.        
21680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21690 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
216a0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
216b0 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
216c0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
216d0 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64  For length() and
216e0 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69   typeof() functi
216f0 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d  ons with a colum
21700 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20  n argument,.    
21710 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50      ** set the P
21720 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  5 parameter to t
21730 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63  he OP_Column opc
21740 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45  ode to OPFLAG_LE
21750 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20 20 20  NGTHARG.        
21760 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50  ** or OPFLAG_TYP
21770 45 4f 46 41 52 47 20 72 65 73 70 65 63 74 69 76  EOFARG respectiv
21780 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e  ely, to avoid un
21790 6e 65 63 65 73 73 61 72 79 20 64 61 74 61 0a 20  necessary data. 
217a0 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e         ** loadin
217b0 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  g..        */.  
217c0 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
217d0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51  >funcFlags & (SQ
217e0 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
217f0 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50  |SQLITE_FUNC_TYP
21800 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  EOF))!=0 ){.    
21810 20 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b        u8 exprOp;
21820 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
21830 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20  t( nFarg==1 );. 
21840 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21850 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21860 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
21870 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72     exprOp = pFar
21880 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  g->a[0].pExpr->o
21890 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  p;.          if(
218a0 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55   exprOp==TK_COLU
218b0 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b  MN || exprOp==TK
218c0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  _AGG_COLUMN ){. 
218d0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
218e0 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  t( SQLITE_FUNC_L
218f0 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45  ENGTH==OPFLAG_LE
21900 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
21910 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
21920 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f  QLITE_FUNC_TYPEO
21930 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  F==OPFLAG_TYPEOF
21940 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
21950 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
21960 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f  f->funcFlags & O
21970 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
21980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
21990 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
219a0 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20  ->op2 = .       
219b0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d             pDef-
219c0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50  >funcFlags & (OP
219d0 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f  FLAG_LENGTHARG|O
219e0 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29  PFLAG_TYPEOFARG)
219f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21a00 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
21a10 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
21a20 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20 20  ePush(pParse);  
21a30 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
21a40 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
21a50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21a60 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
21a70 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20  rse, pFarg, r1, 
21a80 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
21ab0 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  UP|SQLITE_ECEL_F
21ac0 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20 20  ACTOR);.        
21ad0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
21ae0 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20 20  Pop(pParse);    
21af0 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32    /* Ticket 2ea2
21b00 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20  425d34be */.    
21b10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21b20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   r1 = 0;.      }
21b30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21b40 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
21b50 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69  E.      /* Possi
21b60 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65  bly overload the
21b70 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65   function if the
21b80 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
21b90 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69  is.      ** a vi
21ba0 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75  rtual table colu
21bb0 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  mn..      **.   
21bc0 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20     ** For infix 
21bd0 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c  functions (LIKE,
21be0 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61   GLOB, REGEXP, a
21bf0 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68  nd MATCH) use th
21c00 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  e.      ** secon
21c10 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20  d argument, not 
21c20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68  the first, as th
21c30 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65  e argument to te
21c40 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  st to.      ** s
21c50 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f  ee if it is a co
21c60 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61  lumn in a virtua
21c70 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69  l table.  This i
21c80 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20  s done because. 
21c90 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74       ** the left
21ca0 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69   operand of infi
21cb0 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65  x functions (the
21cc0 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74   operand we want
21cd0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   to.      ** con
21ce0 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67  trol overloading
21cf0 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65  ) ends up as the
21d00 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
21d10 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
21d20 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
21d30 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c  expression "A gl
21d40 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c  ob B" is equival
21d50 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
21d60 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65   "glob(B,A).  We
21d70 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65   want to use the
21d80 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22   A in "A glob B"
21d90 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a   to test.      *
21da0 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f  * for function o
21db0 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74  verloading.  But
21dc0 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65   we use the B te
21dd0 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29  rm in "glob(B,A)
21de0 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
21df0 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26    if( nFarg>=2 &
21e00 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  & (pExpr->flags 
21e10 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20  & EP_InfixFunc) 
21e20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
21e30 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
21e40 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
21e50 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
21e60 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  Farg->a[1].pExpr
21e70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
21e80 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20  f( nFarg>0 ){.  
21e90 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
21ea0 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
21eb0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
21ec0 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
21ed0 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
21ee0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21ef0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
21f00 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
21f10 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
21f20 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
21f30 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
21f40 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20  ->pDfltColl; .  
21f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21f60 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
21f70 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20  llSeq, 0, 0, 0, 
21f80 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
21f90 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
21fa0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
21fb0 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f  E_ENABLE_OFFSET_
21fc0 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20 69  SQL_FUNC.      i
21fd0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
21fe0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
21ff0 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20 20 20 20  _OFFSET ){.     
22000 20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d 20     Expr *pArg = 
22010 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
22020 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  r;.        if( p
22030 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  Arg->op==TK_COLU
22040 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
22050 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22060 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c 20  3(v, OP_Offset, 
22070 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70 41  pArg->iTable, pA
22080 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72  rg->iColumn, tar
22090 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  get);.        }e
220a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
220b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
220c0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
220d0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
220e0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23   }.      }else.#
220f0 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
22100 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22110 65 41 64 64 4f 70 34 28 76 2c 20 70 50 61 72 73  eAddOp4(v, pPars
22120 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f 50  e->iSelfTab ? OP
22130 5f 50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50 5f  _PureFunc0 : OP_
22140 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20 20  Function0,.     
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22160 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c 20       constMask, 
22170 72 31 2c 20 74 61 72 67 65 74 2c 20 28 63 68 61  r1, target, (cha
22180 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43  r*)pDef, P4_FUNC
22190 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71  DEF);.        sq
221a0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
221b0 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b  5(v, (u8)nFarg);
221c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
221d0 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73  f( nFarg && cons
221e0 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  tMask==0 ){.    
221f0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
22200 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
22210 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a  se, r1, nFarg);.
22220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
22230 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
22240 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
22250 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
22260 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
22270 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
22280 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
22290 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
222a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
222b0 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
222c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
222d0 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
222e0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
222f0 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70  ECT && (nCol = p
22300 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
22310 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21  >pEList->nExpr)!
22320 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
22330 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
22340 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  ror(pParse, nCol
22350 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
22360 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
22370 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  n sqlite3CodeSub
22380 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
22390 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Expr, 0, 0);.   
223a0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
223b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
223c0 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
223d0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  N: {.      int n
223e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
223f0 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65  r->pLeft->iTable
22400 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
22410 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61  Expr->pLeft->iTa
22420 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ble = sqlite3Cod
22430 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
22440 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
22450 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
22460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
22470 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
22480 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  | pExpr->pLeft->
22490 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
224a0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
224b0 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
224c0 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
224d0 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  !=(n = sqlite3Ex
224e0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
224f0 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20 20  pr->pLeft)) .   
22500 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
22510 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
22520 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e  arse, "%d column
22530 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61  s assigned %d va
22540 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20  lues",.         
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22560 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
22570 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  able, n);.      
22580 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
22590 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61  Expr->pLeft->iTa
225a0 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f  ble + pExpr->iCo
225b0 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lumn;.    }.    
225c0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
225d0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
225e0 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
225f0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22600 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
22610 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
22620 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22630 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22640 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
22650 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
22660 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22670 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
22680 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
22690 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
226a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
226b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
226c0 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
226d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
226e0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
226f0 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
22700 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22710 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22720 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
22730 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
22740 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
22750 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
22760 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
22770 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  arget;.    }.#en
22780 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
22790 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
227a0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
227b0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
227c0 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  D z.    **.    *
227d0 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61  * This is equiva
227e0 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20  lent to.    **. 
227f0 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
22800 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20  D x<=z.    **.  
22810 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64    ** X is stored
22820 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
22830 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74  ..    ** Y is st
22840 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
22850 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
22860 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74  ..    ** Z is st
22870 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
22880 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
22890 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
228a0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
228b0 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
228c0 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
228d0 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  xpr, target, 0, 
228e0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
228f0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
22900 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a     case TK_SPAN:
22910 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
22920 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20  LATE: .    case 
22930 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
22940 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d    pExpr = pExpr-
22950 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 67 6f  >pLeft;.      go
22960 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f  to expr_code_doo
22970 76 65 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ver;.    }..    
22980 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a  case TK_TRIGGER:
22990 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
229a0 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f  he opcode is TK_
229b0 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68  TRIGGER, then th
229c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
229d0 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  a reference.    
229e0 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e    ** to a column
229f0 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72   in the new.* or
22a00 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
22a10 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74  bles available t
22a20 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67  o.      ** trigg
22a30 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20  er programs. In 
22a40 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69  this case Expr.i
22a50 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
22a60 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20  1 for the.      
22a70 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  ** new.* pseudo-
22a80 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20  table, or 0 for 
22a90 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
22aa0 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f  -table. Expr.iCo
22ab0 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  lumn.      ** is
22ac0 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   set to the colu
22ad0 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f  mn of the pseudo
22ae0 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20  -table to read, 
22af0 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20  or to -1 to.    
22b00 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f    ** read the ro
22b10 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20  wid field..     
22b20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
22b30 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69   expression is i
22b40 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
22b50 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63   an OP_Param opc
22b60 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20  ode. The p1.    
22b70 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69    ** parameter i
22b80 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61  s set to 0 for a
22b90 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65  n old.rowid refe
22ba0 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b  rence, or to (i+
22bb0 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  1).      ** to r
22bc0 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72  eference another
22bd0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f   column of the o
22be0 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
22bf0 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20  e, where .      
22c00 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65  ** i is the inde
22c10 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  x of the column.
22c20 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64   For a new.rowid
22c30 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69   reference, p1 i
22c40 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74  s.      ** set t
22c50 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e  o (n+1), where n
22c60 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
22c70 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63  f columns in eac
22c80 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  h pseudo-table..
22c90 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72        ** For a r
22ca0 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
22cb0 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20  other column in 
22cc0 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f  the new.* pseudo
22cd0 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20  -table, p1.     
22ce0 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e   ** is set to (n
22cf0 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61  +2+i), where n a
22d00 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69  nd i are as defi
22d10 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20  ned previously. 
22d20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61  For.      ** exa
22d30 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62  mple, if the tab
22d40 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67  le on which trig
22d50 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66  gers are being f
22d60 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a  ired is.      **
22d70 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20   declared as:.  
22d80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
22d90 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
22da0 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a  1(a, b);.      *
22db0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  *.      ** Then 
22dc0 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  p1 is interprete
22dd0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
22de0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
22df0 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20    p1==0   ->    
22e00 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31  old.rowid     p1
22e10 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==3   ->    new.
22e20 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20  rowid.      **  
22e30 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f   p1==1   ->    o
22e40 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d  ld.a         p1=
22e50 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61  =4   ->    new.a
22e60 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
22e70 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20  2   ->    old.b 
22e80 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20          p1==5   
22e90 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20  ->    new.b     
22ea0 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
22eb0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
22ec0 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
22ed0 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70     int p1 = pExp
22ee0 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61  r->iTable * (pTa
22ef0 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b  b->nCol+1) + 1 +
22f00 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
22f10 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
22f20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
22f30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
22f40 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73  e==1 );.      as
22f50 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
22f60 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70  lumn>=-1 && pExp
22f70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d  r->iColumn<pTab-
22f80 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61  >nCol );.      a
22f90 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b  ssert( pTab->iPK
22fa0 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  ey<0 || pExpr->i
22fb0 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50  Column!=pTab->iP
22fc0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Key );.      ass
22fd0 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31  ert( p1>=0 && p1
22fe0 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32  <(pTab->nCol*2+2
22ff0 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ) );..      sqli
23000 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23010 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74   OP_Param, p1, t
23020 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64  arget);.      Vd
23030 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
23040 5b 25 64 5d 3d 25 73 2e 25 73 22 2c 20 74 61 72  [%d]=%s.%s", tar
23050 67 65 74 2c 0a 20 20 20 20 20 20 20 20 28 70 45  get,.        (pE
23060 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e  xpr->iTable ? "n
23070 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20  ew" : "old"),.  
23080 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43        (pExpr->iC
23090 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64  olumn<0 ? "rowid
230a0 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d  " : pExpr->pTab-
230b0 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
230c0 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a 20 20 20  lumn].zName).   
230d0 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20     ));..#ifndef 
230e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
230f0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
23100 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
23110 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e  n has REAL affin
23120 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72  ity, it may curr
23130 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ently be stored 
23140 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69  as an.      ** i
23150 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52  nteger. Use OP_R
23160 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d  ealAffinity to m
23170 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72  ake sure it is r
23180 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20  eally real..    
23190 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
231a0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39  IDENCE-OF: R-609
231b0 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20  85-57662 SQLite 
231c0 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65  will convert the
231d0 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20   value back to. 
231e0 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67       ** floating
231f0 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72   point when extr
23200 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74  acting it from t
23210 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20  he record.  */. 
23220 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
23230 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20  iColumn>=0 .    
23240 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c     && pTab->aCol
23250 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
23260 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
23270 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
23280 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23290 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
232a0 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
232b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
232c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
232d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
232e0 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f 52    case TK_VECTOR
232f0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
23300 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23310 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73  , "row value mis
23320 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62 72  used");.      br
23330 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
23340 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  case TK_IF_NULL_
23350 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ROW: {.      int
23360 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20 20 20   addrINR;.      
23370 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69 74 65  addrINR = sqlite
23380 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
23390 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70 45 78  P_IfNullRow, pEx
233a0 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
233b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
233c0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
233d0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
233e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
233f0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
23400 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
23410 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
23420 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
23430 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
23440 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
23450 28 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a 20 20  (v, addrINR);.  
23460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
23470 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 49  hangeP3(v, addrI
23480 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  NR, inReg);.    
23490 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
234a0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f      /*.    ** Fo
234b0 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm A:.    **   C
234c0 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48  ASE x WHEN e1 TH
234d0 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
234e0 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
234f0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
23500 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
23510 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a  ** Form B:.    *
23520 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31  *   CASE WHEN e1
23530 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
23540 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
23550 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
23560 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
23570 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20     ** Form A is 
23580 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d  can be transform
23590 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69  ed into the equi
235a0 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73  valent form B as
235b0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
235c0 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65     CASE WHEN x=e
235d0 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78  1 THEN r1 WHEN x
235e0 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a  =e2 THEN r2 ....
235f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48      **        WH
23600 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20  EN x=eN THEN rN 
23610 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
23620 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69  *.    ** X (if i
23630 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20  t exists) is in 
23640 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
23650 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68 65    ** Y is in the
23660 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66   last element of
23670 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
23680 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  if pExpr->x.pLis
23690 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20 20  t->nExpr is.    
236a0 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20 69  ** odd.  The Y i
236b0 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e  s also optional.
236c0 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20    If the number 
236d0 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78  of elements in x
236e0 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69 73  .pList.    ** is
236f0 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69 73   even, then Y is
23700 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68 65   omitted and the
23710 20 22 6f 74 68 65 72 77 69 73 65 22 20 72 65 73   "otherwise" res
23720 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20  ult is NULL..   
23730 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78   ** Ei is in pEx
23740 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
23750 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78 70  ] and Ri is pExp
23760 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b  r->pList->a[i*2+
23770 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  1]..    **.    *
23780 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * The result of 
23790 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
237a0 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68 65  s the Ri for the
237b0 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
237c0 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66  Ei,.    ** or if
237d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74   there is no mat
237e0 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c  ching Ei, the EL
237f0 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66  SE term Y, or if
23800 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a   there is.    **
23810 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e   no ELSE term, N
23820 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ULL..    */.    
23830 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
23840 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20   op==TK_CASE ); 
23850 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c  {.      int endL
23860 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  abel;           
23870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
23880 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20  O label for end 
23890 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a  of CASE stmt */.
238a0 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61        int nextCa
238b0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
238c0 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20          /* GOTO 
238d0 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57  label for next W
238e0 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  HEN clause */.  
238f0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20      int nExpr;  
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62        /* 2x numb
23920 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  er of WHEN terms
23930 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23960 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
23970 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
23980 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  EList;          
23990 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
239a0 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
239b0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
239c0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73  rList_item *aLis
239d0 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79  telem;  /* Array
239e0 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
239f0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70 43  /.      Expr opC
23a00 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20 20  ompare;         
23a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23a20 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f   X==Ei expressio
23a30 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
23a40 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a60 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e  The X expression
23a70 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
23a80 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pTest = 0;      
23a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
23aa0 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72  ==Ei (form A) or
23ab0 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42   just Ei (form B
23ac0 29 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f  ) */.      VVA_O
23ad0 4e 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c  NLY( int iCacheL
23ae0 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69  evel = pParse->i
23af0 43 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20  CacheLevel; ).. 
23b00 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
23b10 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
23b20 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
23b30 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70  t) && pExpr->x.p
23b40 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73  List );.      as
23b50 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c  sert(pExpr->x.pL
23b60 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b  ist->nExpr > 0);
23b70 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
23b80 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
23b90 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20        aListelem 
23ba0 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
23bb0 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73     nExpr = pELis
23bc0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
23bd0 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74  endLabel = sqlit
23be0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
23bf0 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  v);.      if( (p
23c00 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  X = pExpr->pLeft
23c10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
23c20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20  tempX = *pX;.   
23c30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
23c40 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  X->op==TK_COLUMN
23c50 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72   );.        expr
23c60 54 6f 52 65 67 69 73 74 65 72 28 26 74 65 6d 70  ToRegister(&temp
23c70 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  X, exprCodeVecto
23c80 72 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58  r(pParse, &tempX
23c90 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
23ca0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
23cb0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
23cc0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
23cd0 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69  opCompare, 0, si
23ce0 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72 65 29 29  zeof(opCompare))
23cf0 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
23d00 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a  are.op = TK_EQ;.
23d10 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
23d20 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d 70 58  e.pLeft = &tempX
23d30 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20  ;.        pTest 
23d40 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20  = &opCompare;.  
23d50 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
23d60 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31 37  b351d95f9cd5ef17
23d70 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38 36  e9d9dbae18f5ca86
23d80 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20  11190001:.      
23d90 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69    ** The value i
23da0 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68 74  n regFree1 might
23db0 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e   get SCopy-ed in
23dc0 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73 75  to the file resu
23dd0 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  lt..        ** S
23de0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
23df0 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72 65   the regFree1 re
23e00 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65  gister is not re
23e10 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20  used for other. 
23e20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73         ** purpos
23e30 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  es and possibly 
23e40 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
23e50 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65  .        regFree
23e60 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  1 = 0;.      }. 
23e70 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
23e80 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b  nExpr-1; i=i+2){
23e90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23ea0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
23eb0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
23ec0 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20  f( pX ){.       
23ed0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 73 74     assert( pTest
23ee0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
23ef0 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68   opCompare.pRigh
23f00 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
23f10 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
23f20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23f30 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c   pTest = aListel
23f40 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
23f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
23f60 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65  extCase = sqlite
23f70 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
23f80 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
23f90 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d  ase( pTest->op==
23fa0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
23fb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23fc0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
23fd0 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c  pTest, nextCase,
23fe0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
23ff0 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  LL);.        tes
24000 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d  tcase( aListelem
24010 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  [i+1].pExpr->op=
24020 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
24030 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24040 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c  rCode(pParse, aL
24050 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
24060 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
24070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24080 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c  Goto(v, endLabel
24090 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
240a0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
240b0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
240c0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
240d0 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43  veLabel(v, nextC
240e0 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ase);.      }.  
240f0 20 20 20 20 69 66 28 20 28 6e 45 78 70 72 26 31      if( (nExpr&1
24100 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
24110 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
24120 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
24130 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24140 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
24150 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d  List->a[nExpr-1]
24160 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
24170 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24180 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
24190 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rse);.      }els
241a0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
241b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
241c0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
241d0 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
241e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
241f0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
24200 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
24210 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20  Err>0 .         
24220 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61    || pParse->iCa
24230 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65  cheLevel==iCache
24240 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73  Level );.      s
24250 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
24260 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62  eLabel(v, endLab
24270 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  el);.      break
24280 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
24290 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
242a0 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GER.    case TK_
242b0 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61  RAISE: {.      a
242c0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66  ssert( pExpr->af
242d0 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62  finity==OE_Rollb
242e0 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ack .           
242f0 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
24300 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20  ty==OE_Abort.   
24310 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
24320 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46  ->affinity==OE_F
24330 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ail.           |
24340 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
24350 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20  y==OE_Ignore.   
24360 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
24370 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65  !pParse->pTrigge
24380 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  rTab ){.        
24390 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
243a0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
243c0 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
243d0 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
243e0 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
243f0 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  m");.        ret
24400 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
24410 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
24420 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
24430 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
24440 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
24450 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
24460 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
24470 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
24480 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
24490 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
244a0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
244b0 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
244c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
244d0 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
244e0 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20      v, OP_Halt, 
244f0 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67  SQLITE_OK, OE_Ig
24500 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e  nore, 0, pExpr->
24510 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20  u.zToken,0);.   
24520 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
24530 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
24540 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
24550 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
24560 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
24570 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
24580 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
24590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245a0 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
245b0 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  y, pExpr->u.zTok
245c0 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  en, 0, 0);.     
245d0 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   }..      break;
245e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
245f0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
24600 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
24610 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
24620 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
24630 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
24640 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e  Free2);.  return
24650 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   inReg;.}../*.**
24660 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20   Factor out the 
24670 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65  code of the give
24680 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
24690 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
246a0 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ime..**.** If re
246b0 67 44 65 73 74 3e 3d 30 20 74 68 65 6e 20 74 68  gDest>=0 then th
246c0 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61  e result is alwa
246d0 79 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 61  ys stored in tha
246e0 74 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 74  t register and t
246f0 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  he.** result is 
24700 6e 6f 74 20 72 65 75 73 61 62 6c 65 2e 20 20 49  not reusable.  I
24710 66 20 72 65 67 44 65 73 74 3c 30 20 74 68 65 6e  f regDest<0 then
24720 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
24730 20 66 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f   free to .** sto
24740 72 65 20 74 68 65 20 76 61 6c 75 65 20 77 68 65  re the value whe
24750 72 65 65 76 65 72 20 69 74 20 77 61 6e 74 73 2e  reever it wants.
24760 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 77    The register w
24770 68 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73  here the express
24780 69 6f 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65  ion .** is store
24790 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  d is returned.  
247a0 57 68 65 6e 20 72 65 67 44 65 73 74 3c 30 2c 20  When regDest<0, 
247b0 74 77 6f 20 69 64 65 6e 74 69 63 61 6c 20 65 78  two identical ex
247c0 70 72 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a  pressions will.*
247d0 2a 20 63 6f 64 65 20 74 6f 20 74 68 65 20 73 61  * code to the sa
247e0 6d 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  me register..*/.
247f0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
24800 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72  odeAtInit(.  Par
24810 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
24820 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
24830 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
24840 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  pr,      /* The 
24850 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f  expression to co
24860 64 65 20 77 68 65 6e 20 74 68 65 20 56 44 42 45  de when the VDBE
24870 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a   initializes */.
24880 20 20 69 6e 74 20 72 65 67 44 65 73 74 20 20 20    int regDest   
24890 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
248a0 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
248b0 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
248c0 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61  ExprList *p;.  a
248d0 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74  ssert( ConstFact
248e0 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a  orOk(pParse) );.
248f0 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43    p = pParse->pC
24900 6f 6e 73 74 45 78 70 72 3b 0a 20 20 69 66 28 20  onstExpr;.  if( 
24910 72 65 67 44 65 73 74 3c 30 20 26 26 20 70 20 29  regDest<0 && p )
24920 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
24930 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
24940 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  m;.    int i;.  
24950 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61    for(pItem=p->a
24960 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e  , i=p->nExpr; i>
24970 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29  0; pItem++, i--)
24980 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
24990 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73  m->reusable && s
249a0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
249b0 65 28 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72  e(0,pItem->pExpr
249c0 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b  ,pExpr,-1)==0 ){
249d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
249e0 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
249f0 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a  xprReg;.      }.
24a00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70      }.  }.  pExp
24a10 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
24a20 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
24a30 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20  Expr, 0);.  p = 
24a40 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
24a50 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c  ppend(pParse, p,
24a60 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70   pExpr);.  if( p
24a70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20   ){.     struct 
24a80 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
24a90 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
24aa0 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70  nExpr-1];.     p
24ab0 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d  Item->reusable =
24ac0 20 72 65 67 44 65 73 74 3c 30 3b 0a 20 20 20 20   regDest<0;.    
24ad0 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20 29   if( regDest<0 )
24ae0 20 72 65 67 44 65 73 74 20 3d 20 2b 2b 70 50 61   regDest = ++pPa
24af0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
24b00 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
24b10 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74  xprReg = regDest
24b20 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
24b30 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a  pConstExpr = p;.
24b40 20 20 72 65 74 75 72 6e 20 72 65 67 44 65 73 74    return regDest
24b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
24b60 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
24b70 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
24b80 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  on and store the
24b90 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
24ba0 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65   a register.  Re
24bb0 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
24bc0 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  r number where t
24bd0 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72  he results.** ar
24be0 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
24bf0 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  If the register 
24c00 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  is a temporary r
24c10 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e  egister that can
24c20 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   be deallocated,
24c30 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69  .** then write i
24c40 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ts number into *
24c50 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65  pReg.  If the re
24c60 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
24c70 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72   not.** a tempor
24c80 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ary, then set *p
24c90 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a  Reg to zero..**.
24ca0 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
24cb0 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
24cc0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
24cd0 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73  ht generate this
24ce0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c  .** code to fill
24cf0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
24d00 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
24d10 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  ion section of t
24d20 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72  he.** VDBE progr
24d30 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  am, in order to 
24d40 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66  factor it out of
24d50 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
24d60 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  loop..*/.int sql
24d70 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
24d80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24d90 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
24da0 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72   *pReg){.  int r
24db0 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c  2;.  pExpr = sql
24dc0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
24dd0 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ate(pExpr);.  if
24de0 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
24df0 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45  pParse).   && pE
24e00 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
24e10 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74  STER.   && sqlit
24e20 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
24e30 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20  NotJoin(pExpr). 
24e40 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d   ){.    *pReg  =
24e50 20 30 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c   0;.    r2 = sql
24e60 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
24e70 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
24e80 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , -1);.  }else{.
24e90 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
24ea0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
24eb0 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d  Parse);.    r2 =
24ec0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24ed0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
24ee0 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69  Expr, r1);.    i
24ef0 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20  f( r2==r1 ){.   
24f00 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20     *pReg = r1;. 
24f10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24f20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
24f30 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
24f40 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  );.      *pReg =
24f50 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
24f60 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a  return r2;.}../*
24f70 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
24f80 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
24f90 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
24fa0 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
24fb0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
24fc0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
24fd0 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
24fe0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
24ff0 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
25000 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
25010 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
25020 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
25030 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
25040 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
25050 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20  .  int inReg;.. 
25060 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
25070 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
25080 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
25090 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70  f( pExpr && pExp
250a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
250b0 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ER ){.    sqlite
250c0 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
250d0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f  se->pVdbe, OP_Co
250e0 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  py, pExpr->iTabl
250f0 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65  e, target);.  }e
25100 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d  lse{.    inReg =
25110 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25120 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
25130 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
25140 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
25150 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70  e->pVdbe!=0 || p
25160 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
25170 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
25180 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
25190 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62   && pParse->pVdb
251a0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
251b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
251c0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
251d0 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
251e0 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  get);.    }.  }.
251f0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
25200 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f  transient copy o
25210 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
25220 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65  pr and then code
25230 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c   it using.** sql
25240 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20  ite3ExprCode(). 
25250 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
25260 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71  rks just like sq
25270 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a  lite3ExprCode().
25280 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 74  ** except that t
25290 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73  he input express
252a0 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65  ion is guarantee
252b0 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65  d to be unchange
252c0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
252d0 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50  e3ExprCodeCopy(P
252e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
252f0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
25300 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65  arget){.  sqlite
25310 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
25320 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  db;.  pExpr = sq
25330 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
25340 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66   pExpr, 0);.  if
25350 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
25360 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78 70  led ) sqlite3Exp
25370 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
25380 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
25390 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
253a0 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  e(db, pExpr);.}.
253b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
253c0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
253d0 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
253e0 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
253f0 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
25400 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
25410 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
25420 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
25430 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
25440 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
25450 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  t.  If the expre
25460 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
25470 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
25480 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68  tine.** might ch
25490 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65  oose to code the
254a0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69   expression at i
254b0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
254c0 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
254d0 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
254e0 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  rable(Parse *pPa
254f0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
25500 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
25510 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43   if( pParse->okC
25520 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73 71  onstFactor && sq
25530 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
25540 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
25550 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
25560 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
25570 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
25580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
25590 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
255a0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
255b0 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  et);.  }.}../*.*
255c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
255d0 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
255e0 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
255f0 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65  ion and puts the
25600 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65   result.** in re
25610 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
25620 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61  *.** Also make a
25630 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
25640 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20  ression results 
25650 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61  into another "ca
25660 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a  che" register.**
25670 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
25680 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68  expression so th
25690 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  at the next time
256a0 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
256b0 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
256c0 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
256d0 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e   cache register.
256e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
256f0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
25700 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
25710 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70   are used multip
25720 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54  le .** times.  T
25730 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65  hey are evaluate
25740 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  d once and the r
25750 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78  esults of the ex
25760 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  pression.** are 
25770 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  reused..*/.void 
25780 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
25790 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
257a0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
257b0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
257c0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
257d0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
257e0 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72  t iMem;..  asser
257f0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
25800 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
25810 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op!=TK_REGISTER 
25820 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
25830 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
25840 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69  pr, target);.  i
25850 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
25860 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56  nMem;.  sqlite3V
25870 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
25880 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d  Copy, target, iM
25890 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  em);.  exprToReg
258a0 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65  ister(pExpr, iMe
258b0 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  m);.}../*.** Gen
258c0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
258d0 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
258e0 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
258f0 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
25900 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
25910 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63  t into a sequenc
25920 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  e of registers b
25930 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67  eginning at targ
25940 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  et..**.** Return
25950 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
25960 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65  lements evaluate
25970 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72  d.  The number r
25980 65 74 75 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a 20  eturned will.** 
25990 75 73 75 61 6c 6c 79 20 62 65 20 70 4c 69 73 74  usually be pList
259a0 2d 3e 6e 45 78 70 72 20 62 75 74 20 6d 69 67 68  ->nExpr but migh
259b0 74 20 62 65 20 72 65 64 75 63 65 64 20 69 66 20  t be reduced if 
259c0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
259d0 52 45 46 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  REF.** is define
259e0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  d..**.** The SQL
259f0 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61  ITE_ECEL_DUP fla
25a00 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61  g prevents the a
25a10 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65  rguments from be
25a20 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73  ing.** filled us
25a30 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f  ing OP_SCopy.  O
25a40 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75  P_Copy must be u
25a50 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
25a60 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
25a70 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65  EL_FACTOR argume
25a80 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61  nt allows consta
25a90 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  nt arguments to 
25aa0 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f  be.** factored o
25ab0 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69  ut into initiali
25ac0 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a  zation code..**.
25ad0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
25ae0 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e  EL_REF flag mean
25af0 73 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  s that expressio
25b00 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77  ns in the list w
25b10 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e  ith.** ExprList.
25b20 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  a[].u.x.iOrderBy
25b30 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61  Col>0 have alrea
25b40 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65  dy been evaluate
25b50 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20  d and stored.** 
25b60 69 6e 20 72 65 67 69 73 74 65 72 73 20 61 74 20  in registers at 
25b70 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74  srcReg, and so t
25b80 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  he value can be 
25b90 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72  copied from ther
25ba0 65 2e 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  e..** If SQLITE_
25bb0 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 69 73 20  ECEL_OMITREF is 
25bc0 61 6c 73 6f 20 73 65 74 2c 20 74 68 65 6e 20 74  also set, then t
25bd0 68 65 20 76 61 6c 75 65 73 20 77 69 74 68 20 75  he values with u
25be0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
25bf0 0a 2a 2a 20 61 72 65 20 73 69 6d 70 6c 79 20 6f  .** are simply o
25c00 6d 69 74 74 65 64 20 72 61 74 68 65 72 20 74 68  mitted rather th
25c10 61 6e 20 62 65 69 6e 67 20 63 6f 70 69 65 64 20  an being copied 
25c20 66 72 6f 6d 20 73 72 63 52 65 67 2e 0a 2a 2f 0a  from srcReg..*/.
25c30 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
25c40 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50  odeExprList(.  P
25c50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
25c60 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
25c70 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
25c80 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
25c90 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
25ca0 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ist to be coded 
25cb0 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c  */.  int target,
25cc0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
25cd0 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74   to write result
25ce0 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52 65  s */.  int srcRe
25cf0 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75  g,        /* Sou
25d00 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69 66  rce registers if
25d10 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
25d20 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20   */.  u8 flags  
25d30 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
25d40 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20  TE_ECEL_* flags 
25d50 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
25d60 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
25d70 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  tem;.  int i, j,
25d80 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20   n;.  u8 copyOp 
25d90 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
25da0 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50  E_ECEL_DUP) ? OP
25db0 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79  _Copy : OP_SCopy
25dc0 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
25dd0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
25de0 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
25df0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  );.  assert( tar
25e00 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  get>0 );.  asser
25e10 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
25e20 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72  !=0 );  /* Never
25e30 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20 6f   gets this far o
25e40 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20  therwise */.  n 
25e50 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
25e60 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74    if( !ConstFact
25e70 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66  orOk(pParse) ) f
25e80 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
25e90 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66  ECEL_FACTOR;.  f
25ea0 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
25eb0 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  a, i=0; i<n; i++
25ec0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
25ed0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49  Expr *pExpr = pI
25ee0 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 23 69 66 64  tem->pExpr;.#ifd
25ef0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
25f00 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
25f10 45 53 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  ES.    if( pItem
25f20 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 29 7b 0a  ->bSorterRef ){.
25f30 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20        i--;.     
25f40 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 0a   n--;.    }else.
25f50 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
25f60 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25f70 43 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28  CEL_REF)!=0 && (
25f80 6a 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  j = pItem->u.x.i
25f90 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b  OrderByCol)>0 ){
25fa0 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73  .      if( flags
25fb0 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f   & SQLITE_ECEL_O
25fc0 4d 49 54 52 45 46 20 29 7b 0a 20 20 20 20 20 20  MITREF ){.      
25fd0 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e    i--;.        n
25fe0 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
25ff0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26000 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f  VdbeAddOp2(v, co
26010 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31  pyOp, j+srcReg-1
26020 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
26030 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
26040 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  f( (flags & SQLI
26050 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21  TE_ECEL_FACTOR)!
26060 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  =0 && sqlite3Exp
26070 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  rIsConstant(pExp
26080 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
26090 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
260a0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
260b0 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
260c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
260d0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
260e0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
260f0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
26100 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69  rget+i);.      i
26110 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
26120 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64  +i ){.        Vd
26130 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20  beOp *pOp;.     
26140 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f     if( copyOp==O
26150 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20  P_Copy.         
26160 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56  && (pOp=sqlite3V
26170 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29  dbeGetOp(v, -1))
26180 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70  ->opcode==OP_Cop
26190 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  y.         && pO
261a0 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p1+pOp->p3+1=
261b0 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  =inReg.         
261c0 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e  && pOp->p2+pOp->
261d0 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20  p3+1==target+i. 
261e0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
261f0 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20      pOp->p3++;. 
26200 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26210 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
26220 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
26230 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  yOp, inReg, targ
26240 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  et+i);.        }
26250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26260 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
26270 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
26280 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57   code for a BETW
26290 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  EEN operator..**
262a0 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e  .**    x BETWEEN
262b0 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54   y AND z.**.** T
262c0 68 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69  he above is equi
262d0 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a  valent to .**.**
262e0 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
262f0 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20  z.**.** Code it 
26300 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
26310 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
26320 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
26330 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69  ion.** eliminati
26340 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54  on of x..**.** T
26350 68 65 20 78 4a 75 6d 70 49 66 20 70 61 72 61 6d  he xJumpIf param
26360 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
26370 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20  details:.**.**  
26380 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20 20 20 20    NULL:         
26390 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20            Store 
263a0 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
263b0 6c 74 20 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a  lt in reg[dest].
263c0 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  **    sqlite3Exp
263d0 72 49 66 54 72 75 65 3a 20 20 20 20 20 20 4a 75  rIfTrue:      Ju
263e0 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20 74 72  mp to dest if tr
263f0 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  ue.**    sqlite3
26400 45 78 70 72 49 66 46 61 6c 73 65 3a 20 20 20 20  ExprIfFalse:    
26410 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66   Jump to dest if
26420 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65   false.**.** The
26430 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61   jumpIfNull para
26440 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
26450 20 69 66 20 78 4a 75 6d 70 49 66 20 69 73 20 4e   if xJumpIf is N
26460 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ULL..*/.static v
26470 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77  oid exprCodeBetw
26480 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  een(.  Parse *pP
26490 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
264a0 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
264b0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
264c0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
264d0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45  ,      /* The BE
264e0 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e  TWEEN expression
264f0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
26500 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
26510 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73  destination or s
26520 74 6f 72 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20  torage location 
26530 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d  */.  void (*xJum
26540 70 29 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c  p)(Parse*,Expr*,
26550 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74  int,int), /* Act
26560 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20  ion to take */. 
26570 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
26580 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a     /* Take the j
26590 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45  ump if the BETWE
265a0 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  EN is NULL */.){
265b0 0a 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20  . Expr exprAnd; 
265c0 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f      /* The AND o
265d0 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79  perator in  x>=y
265e0 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20   AND x<=z  */.  
265f0 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20  Expr compLeft;  
26600 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20    /* The  x>=y  
26610 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63  term */.  Expr c
26620 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54  ompRight;   /* T
26630 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a  he  x<=z  term *
26640 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20  /.  Expr exprX; 
26650 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20        /* The  x 
26660 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
26670 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
26680 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61   = 0; /* Tempora
26690 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20  ry use register 
266a0 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63  */...  memset(&c
266b0 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65  ompLeft, 0, size
266c0 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d  of(Expr));.  mem
266d0 73 65 74 28 26 63 6f 6d 70 52 69 67 68 74 2c 20  set(&compRight, 
266e0 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
266f0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 78 70 72  ;.  memset(&expr
26700 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  And, 0, sizeof(E
26710 78 70 72 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  xpr));..  assert
26720 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
26730 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
26740 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70  Select) );.  exp
26750 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65  rX = *pExpr->pLe
26760 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70  ft;.  exprAnd.op
26770 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70   = TK_AND;.  exp
26780 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f  rAnd.pLeft = &co
26790 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  mpLeft;.  exprAn
267a0 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70  d.pRight = &comp
267b0 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66  Right;.  compLef
267c0 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20  t.op = TK_GE;.  
267d0 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d  compLeft.pLeft =
267e0 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c   &exprX;.  compL
267f0 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  eft.pRight = pEx
26800 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
26810 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52  ].pExpr;.  compR
26820 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b  ight.op = TK_LE;
26830 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65  .  compRight.pLe
26840 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
26850 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20  ompRight.pRight 
26860 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
26870 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
26880 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
26890 65 78 70 72 58 2c 20 65 78 70 72 43 6f 64 65 56  exprX, exprCodeV
268a0 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 65  ector(pParse, &e
268b0 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
268c0 29 3b 0a 20 20 69 66 28 20 78 4a 75 6d 70 20 29  );.  if( xJump )
268d0 7b 0a 20 20 20 20 78 4a 75 6d 70 28 70 50 61 72  {.    xJump(pPar
268e0 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
268f0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
26900 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
26910 20 4d 61 72 6b 20 74 68 65 20 65 78 70 72 65 73   Mark the expres
26920 73 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 66 72  sion is being fr
26930 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  om the ON or USI
26940 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  NG clause of a j
26950 6f 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68  oin.    ** so th
26960 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 45 78  at the sqlite3Ex
26970 70 72 43 6f 64 65 54 61 72 67 65 74 28 29 20 72  prCodeTarget() r
26980 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20  outine will not 
26990 61 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a  attempt to move.
269a0 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74      ** it into t
269b0 68 65 20 50 61 72 73 65 2e 70 43 6f 6e 73 74 45  he Parse.pConstE
269c0 78 70 72 20 6c 69 73 74 2e 20 20 57 65 20 73 68  xpr list.  We sh
269d0 6f 75 6c 64 20 75 73 65 20 61 20 6e 65 77 20 62  ould use a new b
269e0 69 74 20 66 6f 72 20 74 68 69 73 2c 0a 20 20 20  it for this,.   
269f0 20 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74 79 2c   ** for clarity,
26a00 20 62 75 74 20 77 65 20 61 72 65 20 6f 75 74 20   but we are out 
26a10 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 45  of bits in the E
26a20 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 20  xpr.flags field 
26a30 73 6f 20 77 65 0a 20 20 20 20 2a 2a 20 68 61 76  so we.    ** hav
26a40 65 20 74 6f 20 72 65 75 73 65 20 74 68 65 20 45  e to reuse the E
26a50 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20  P_FromJoin bit. 
26a60 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20   Bummer. */.    
26a70 65 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45  exprX.flags |= E
26a80 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20  P_FromJoin;.    
26a90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
26aa0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 26 65  arget(pParse, &e
26ab0 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20  xprAnd, dest);. 
26ac0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
26ad0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
26ae0 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20  e, regFree1);.. 
26af0 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75   /* Ensure adequ
26b00 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67  ate test coverag
26b10 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  e */.  testcase(
26b20 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26b30 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
26b40 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
26b50 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26b60 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26b70 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
26b80 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
26b90 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
26ba0 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
26bb0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
26bc0 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
26bd0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
26be0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26bf0 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26c00 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26c10 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
26c20 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
26c30 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
26c40 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
26c50 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
26c60 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
26c70 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
26c80 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
26c90 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
26ca0 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
26cb0 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
26cc0 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
26cd0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
26ce0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26cf0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
26d00 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
26d10 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
26d20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
26d30 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
26d40 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
26d50 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
26d60 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
26d70 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  0 );.}../*.** Ge
26d80 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
26d90 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
26da0 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
26db0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
26dc0 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
26dd0 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
26de0 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
26df0 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
26e00 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
26e10 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
26e20 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
26e30 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
26e40 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
26e50 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
26e60 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
26e70 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
26e80 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
26e90 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
26ea0 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a  flag is SQLITE_J
26eb0 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  UMPIFNULL..**.**
26ec0 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
26ed0 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
26ee0 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65  hat certain toke
26ef0 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b  n values (ex: TK
26f00 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20  _EQ).** are the 
26f10 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76  same as opcode v
26f20 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71  alues (ex: OP_Eq
26f30 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  ) that implement
26f40 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
26f50 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  ng.** operation.
26f60 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e    Special commen
26f70 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64  ts in vdbe.c and
26f80 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
26f90 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20  wk script in.** 
26fa0 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73  the make process
26fb0 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c   cause these val
26fc0 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41  ues to align.  A
26fd0 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20  ssert()s in the 
26fe0 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65  code.** below ve
26ff0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
27000 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65  mbers are aligne
27010 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  d correctly..*/.
27020 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
27030 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
27040 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
27050 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
27060 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
27070 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
27080 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
27090 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
270a0 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
270b0 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
270c0 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
270d0 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
270e0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
270f0 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
27100 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
27110 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20  NEVER(v==0) )   
27120 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78    return;  /* Ex
27130 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
27140 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
27150 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  r */.  if( NEVER
27160 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74  (pExpr==0) ) ret
27170 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20  urn;  /* No way 
27180 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
27190 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  */.  op = pExpr-
271a0 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
271b0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
271c0 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _AND: {.      in
271d0 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
271e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
271f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27200 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
27210 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27220 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
27230 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
27240 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  d2,jumpIfNull^SQ
27250 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
27260 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27270 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
27280 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
27290 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
272a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
272b0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
272c0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
272d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
272e0 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
272f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27300 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
27310 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27320 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27330 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OR: {.      test
27340 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
27350 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
27360 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
27370 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27380 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
27390 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
273a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
273b0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
273c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
273d0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
273e0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
273f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
27400 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27410 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
27420 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27430 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27440 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
27450 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
27460 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
27470 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
27480 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
27490 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
274a0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
274b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
274c0 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
274d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f  {.      int isNo
274e0 74 3b 20 20 20 20 20 20 2f 2a 20 49 53 20 4e 4f  t;      /* IS NO
274f0 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54  T TRUE or IS NOT
27500 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20   FALSE */.      
27510 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20 20  int isTrue;     
27520 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
27530 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
27540 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
27550 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
27560 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70      isNot = pExp
27570 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54  r->op2==TK_ISNOT
27580 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d  ;.      isTrue =
27590 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74   sqlite3ExprTrut
275a0 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52  hValue(pExpr->pR
275b0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73  ight);.      tes
275c0 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
275d0 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
275e0 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75  testcase( !isTru
275f0 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
27600 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e      if( isTrue ^
27610 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20   isNot ){.      
27620 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
27630 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
27640 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a  r->pLeft, dest,.
27650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27660 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20            isNot 
27670 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ? SQLITE_JUMPIFN
27680 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ULL : 0);.      
27690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
276a0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
276b0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
276c0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20  >pLeft, dest,.  
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276e0 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f           isNot ?
276f0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
27700 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d  LL : 0);.      }
27710 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27720 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27730 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
27740 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73  ISNOT:.      tes
27750 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
27760 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
27770 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  se( op==TK_ISNOT
27780 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
27790 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
277a0 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
277b0 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53    jumpIfNull = S
277c0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
277d0 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
277e0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
277f0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
27800 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
27810 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
27820 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
27830 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
27840 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EQ: {.      if( 
27850 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
27860 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  tor(pExpr->pLeft
27870 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74  ) ) goto default
27880 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73  _expr;.      tes
27890 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
278a0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
278b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
278c0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
278d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
278e0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
278f0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
27900 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
27910 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
27920 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
27930 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
27940 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
27950 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
27960 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
27970 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
27980 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
27990 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
279a0 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
279b0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
279c0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
279d0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
279e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
279f0 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
27a00 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
27a10 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
27a20 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
27a30 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
27a40 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
27a50 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
27a60 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27a70 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
27a80 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
27a90 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
27aa0 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
27ab0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
27ac0 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
27ad0 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
27ae0 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
27af0 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
27b00 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27b10 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
27b20 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
27b30 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
27b40 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
27b50 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
27b60 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
27b70 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
27b80 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
27b90 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
27ba0 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  se(op==OP_Ne);. 
27bb0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27bc0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
27bd0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
27be0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
27bf0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27c00 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
27c10 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
27c20 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
27c30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27c40 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
27c50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27c60 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
27c70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27c80 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
27c90 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
27ca0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
27cb0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
27cc0 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
27cd0 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
27ce0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
27cf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
27d00 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
27d10 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65  Null ); testcase
27d20 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
27d30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
27d40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
27d50 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
27d60 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
27d70 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
27d80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
27d90 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
27da0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27db0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
27dc0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
27dd0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27de0 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
27df0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27e00 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
27e10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27e20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
27e30 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
27e40 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27e50 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27e60 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
27e70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
27e80 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
27e90 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75  IfTrue, jumpIfNu
27ea0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
27eb0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
27ec0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
27ed0 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
27ee0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
27ef0 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
27f00 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
27f10 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
27f20 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a  t destIfNull = j
27f30 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74  umpIfNull ? dest
27f40 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   : destIfFalse;.
27f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27f60 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
27f70 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
27f80 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
27f90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27fa0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
27fb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27fc0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
27fd0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
27fe0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27ff0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
28000 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
28010 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20  ault_expr:.     
28020 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
28030 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
28040 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28050 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
28060 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
28070 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
28080 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
28090 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* No-op */.  
280a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
280b0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
280c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
280d0 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
280e0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
280f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
28100 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
28110 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
28120 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
28130 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
28140 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28150 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
28160 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
28170 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
28180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28190 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
281a0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
281b0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
281c0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
281d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
281e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
281f0 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
28200 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
28210 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
28220 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
28230 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
28240 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
28250 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
28260 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
28270 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
28280 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
28290 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
282a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
282b0 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
282c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
282d0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
282e0 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
282f0 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
28300 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
28310 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
28320 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
28330 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
28340 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
28350 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
28360 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
28370 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
28380 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
28390 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
283a0 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
283b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
283c0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
283d0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
283e0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
283f0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
28400 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
28410 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
28420 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
28430 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28440 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
28450 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45  ) ) return; /* E
28460 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
28470 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
28480 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  er */.  if( pExp
28490 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e  r==0 )    return
284a0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
284b0 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
284c0 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
284d0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
284e0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
284f0 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
28500 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
28510 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
28520 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
28530 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
28540 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
28550 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
28560 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
28570 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
28580 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
285a0 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
285b0 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
285c0 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
285d0 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
285e0 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
285f0 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
28600 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
28610 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
28620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
28630 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
28640 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
28650 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
28660 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
28670 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
28680 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
28690 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
286a0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
286b0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
286c0 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
286d0 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
286e0 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
286f0 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
28700 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
28710 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
28720 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
28730 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
28740 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
28750 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
28760 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
28770 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
28780 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
28790 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
287a0 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
287b0 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
287c0 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
287d0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
287e0 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
287f0 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
28800 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
28810 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
28820 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
28830 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
28840 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
28850 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
28860 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
28870 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
28880 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
28890 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
288a0 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
288b0 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
288c0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
288d0 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
288e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
288f0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
28900 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
28910 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28920 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
28930 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
28940 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
28950 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
28960 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
28970 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
28980 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
28990 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
289a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
289b0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
289c0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
289d0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
289e0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
289f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
28a00 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
28a10 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
28a20 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
28a30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
28a40 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
28a50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
28a60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
28a70 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
28a80 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
28a90 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
28aa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
28ab0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
28ac0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28ad0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
28ae0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
28af0 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49   jumpIfNull^SQLI
28b00 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
28b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28b20 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
28b30 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
28b40 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
28b50 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
28b60 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
28b70 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
28b80 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
28b90 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
28ba0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
28bb0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
28bc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28bd0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
28be0 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
28bf0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
28c00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
28c10 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
28c20 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28c30 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
28c40 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
28c50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
28c60 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a  ase TK_TRUTH: {.
28c70 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b        int isNot;
28c80 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55     /* IS NOT TRU
28c90 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c 53  E or IS NOT FALS
28ca0 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  E */.      int i
28cb0 73 54 72 75 65 3b 20 20 2f 2a 20 49 53 20 54 52  sTrue;  /* IS TR
28cc0 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55  UE or IS NOT TRU
28cd0 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  E */.      testc
28ce0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28cf0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f  =0 );.      isNo
28d00 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d  t = pExpr->op2==
28d10 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20  TK_ISNOT;.      
28d20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33  isTrue = sqlite3
28d30 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70  ExprTruthValue(p
28d40 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
28d50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
28d60 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29  sTrue && isNot )
28d70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28d80 28 20 21 69 73 54 72 75 65 20 26 26 20 69 73 4e  ( !isTrue && isN
28d90 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ot );.      if( 
28da0 69 73 54 72 75 65 20 5e 20 69 73 4e 6f 74 20 29  isTrue ^ isNot )
28db0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20  {.        /* IS 
28dc0 54 52 55 45 20 61 6e 64 20 49 53 20 4e 4f 54 20  TRUE and IS NOT 
28dd0 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 20  FALSE */.       
28de0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
28df0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
28e00 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a  r->pLeft, dest,.
28e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
28e30 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55   ? 0 : SQLITE_JU
28e40 4d 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  MPIFNULL);..    
28e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28e60 20 2f 2a 20 49 53 20 46 41 4c 53 45 20 61 6e 64   /* IS FALSE and
28e70 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a   IS NOT TRUE */.
28e80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28e90 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
28ea0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28eb0 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  dest,.          
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ed0 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49  isNot ? 0 : SQLI
28ee0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
28ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
28f00 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
28f10 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
28f20 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
28f30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
28f40 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
28f50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28f60 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
28f70 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f  ISNOT );.      o
28f80 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  p = (pExpr->op==
28f90 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a  TK_IS) ? TK_NE :
28fa0 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75   TK_EQ;.      ju
28fb0 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54  mpIfNull = SQLIT
28fc0 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
28fd0 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
28fe0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
28ff0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
29000 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
29010 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
29020 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
29030 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
29040 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
29050 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
29060 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20  pExpr->pLeft) ) 
29070 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70  goto default_exp
29080 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  r;.      testcas
29090 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
290a0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
290b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
290c0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
290d0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
290e0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
290f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
29100 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
29110 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
29120 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
29130 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
29140 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
29150 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
29160 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29170 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
29180 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
29190 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
291a0 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
291b0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
291c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
291d0 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
291e0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
291f0 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
29200 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
29210 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
29220 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
29230 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
29240 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
29250 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
29260 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
29270 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
29280 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
29290 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
292a0 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
292b0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
292c0 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
292d0 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
292e0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
292f0 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64  OP_Eq);.      Vd
29300 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
29310 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
29320 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
29330 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
29340 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
29350 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
29360 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
29370 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
29380 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
29390 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
293a0 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
293b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
293c0 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
293d0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
293e0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
293f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
29400 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
29410 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
29420 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
29430 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
29440 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
29450 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
29460 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
29470 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
29480 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
29490 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
294a0 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72  TNULL: {.      r
294b0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
294c0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
294d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
294e0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
294f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29500 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
29510 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
29520 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
29530 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72  L );   VdbeCover
29540 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
29550 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  ISNULL);.      t
29560 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
29570 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65  NOTNULL );  Vdbe
29580 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
29590 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
295a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
295b0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
295c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
295d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
295e0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
295f0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
29600 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
29610 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
29620 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
29630 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49  st, sqlite3ExprI
29640 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75  fFalse, jumpIfNu
29650 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
29660 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
29670 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
29680 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
29690 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _IN: {.      if(
296a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20   jumpIfNull ){. 
296b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
296c0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
296d0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
296e0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
296f0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65  {.        int de
29700 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
29710 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
29720 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
29730 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
29740 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
29750 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  t, destIfNull);.
29760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
29770 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
29780 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
29790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
297a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
297b0 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
297c0 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70  .    default_exp
297d0 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65 78  r: .      if( ex
297e0 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
297f0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
29800 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
29810 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
29820 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
29830 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
29840 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  ){.        /* no
29850 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
29860 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
29870 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
29880 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
29890 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
298a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
298b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
298c0 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
298d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
298e0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
298f0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
29900 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
29910 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
29920 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
29930 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
29940 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
29950 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
29960 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
29970 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
29980 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
29990 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
299a0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
299b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65  );.}../*.** Like
299c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
299d0 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61  lse() except tha
299e0 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65  t a copy is made
299f0 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65   of pExpr before
29a00 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74  .** code generat
29a10 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f  ion, and that co
29a20 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66  py is deleted af
29a30 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ter code generat
29a40 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73  ion. This.** ens
29a50 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72  ures that the or
29a60 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20  iginal pExpr is 
29a70 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
29a80 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
29a90 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a  FalseDup(Parse *
29aa0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
29ab0 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e  xpr, int dest,in
29ac0 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
29ad0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
29ae0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
29af0 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74  r *pCopy = sqlit
29b00 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
29b10 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  xpr, 0);.  if( d
29b20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
29b30 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
29b40 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
29b50 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74  rse, pCopy, dest
29b60 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
29b70 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
29b80 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79  Delete(db, pCopy
29b90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72  );.}../*.** Expr
29ba0 65 73 73 69 6f 6e 20 70 56 61 72 20 69 73 20 67  ession pVar is g
29bb0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
29bc0 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 2e  an SQL variable.
29bd0 20 70 45 78 70 72 20 6d 61 79 20 62 65 20 61 6e   pExpr may be an
29be0 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65 78 70  y.** type of exp
29bf0 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ression..**.** I
29c00 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d  f pExpr is a sim
29c10 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 2d 20  ple SQL value - 
29c20 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c  an integer, real
29c30 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a  , string, blob.*
29c40 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65 20  * or NULL value 
29c50 2d 20 74 68 65 6e 20 74 68 65 20 56 44 42 45 20  - then the VDBE 
29c60 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
29c70 70 72 65 70 61 72 65 64 20 69 73 20 63 6f 6e 66  prepared is conf
29c80 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72 65 2d  igured.** to re-
29c90 70 72 65 70 61 72 65 20 65 61 63 68 20 74 69 6d  prepare each tim
29ca0 65 20 61 20 6e 65 77 20 76 61 6c 75 65 20 69 73  e a new value is
29cb0 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62   bound to variab
29cc0 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41  le pVar..**.** A
29cd0 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20  dditionally, if 
29ce0 70 45 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c  pExpr is a simpl
29cf0 65 20 53 51 4c 20 76 61 6c 75 65 20 61 6e 64 20  e SQL value and 
29d00 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 68 65  the value is the
29d10 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68 61 74  .** same as that
29d20 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75 6e 64   currently bound
29d30 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61   to variable pVa
29d40 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  r, non-zero is r
29d50 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65  eturned..** Othe
29d60 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 76 61  rwise, if the va
29d70 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 74 68 65  lues are not the
29d80 20 73 61 6d 65 20 6f 72 20 69 66 20 70 45 78 70   same or if pExp
29d90 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c  r is not a simpl
29da0 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65 2c 20  e.** SQL value, 
29db0 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
29dc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29dd0 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61  exprCompareVaria
29de0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
29df0 65 2c 20 45 78 70 72 20 2a 70 56 61 72 2c 20 45  e, Expr *pVar, E
29e00 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
29e10 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 6e  nt res = 0;.  in
29e20 74 20 69 56 61 72 3b 0a 20 20 73 71 6c 69 74 65  t iVar;.  sqlite
29e30 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a 70 52  3_value *pL, *pR
29e40 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c 69 74   = 0;.  .  sqlit
29e50 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
29e60 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
29e70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  r, SQLITE_UTF8, 
29e80 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c  SQLITE_AFF_BLOB,
29e90 20 26 70 52 29 3b 0a 20 20 69 66 28 20 70 52 20   &pR);.  if( pR 
29ea0 29 7b 0a 20 20 20 20 69 56 61 72 20 3d 20 70 56  ){.    iVar = pV
29eb0 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ar->iColumn;.   
29ec0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
29ed0 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70  armask(pParse->p
29ee0 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20  Vdbe, iVar);.   
29ef0 20 70 4c 20 3d 20 73 71 6c 69 74 65 33 56 64 62   pL = sqlite3Vdb
29f00 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70  eGetBoundValue(p
29f10 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
29f20 65 2c 20 69 56 61 72 2c 20 53 51 4c 49 54 45 5f  e, iVar, SQLITE_
29f30 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20 20 69  AFF_BLOB);.    i
29f40 66 28 20 70 4c 20 29 7b 0a 20 20 20 20 20 20 69  f( pL ){.      i
29f50 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
29f60 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c 49 54  _type(pL)==SQLIT
29f70 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
29f80 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
29f90 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b  text(pL); /* Mak
29fa0 65 20 73 75 72 65 20 74 68 65 20 65 6e 63 6f 64  e sure the encod
29fb0 69 6e 67 20 69 73 20 55 54 46 2d 38 20 2a 2f 0a  ing is UTF-8 */.
29fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
29fd0 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65 33 4d  s =  0==sqlite3M
29fe0 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20 70 52  emCompare(pL, pR
29ff0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
2a000 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
2a010 28 70 52 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (pR);.    sqlite
2a020 33 56 61 6c 75 65 46 72 65 65 28 70 4c 29 3b 0a  3ValueFree(pL);.
2a030 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65    }..  return re
2a040 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  s;.}../*.** Do a
2a050 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
2a060 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
2a070 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
2a080 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
2a090 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
2a0a0 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
2a0b0 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
2a0c0 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
2a0d0 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
2a0e0 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
2a0f0 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
2a100 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
2a110 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
2a120 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
2a130 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
2a140 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
2a150 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
2a160 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
2a170 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
2a180 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
2a190 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
2a1a0 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
2a1b0 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
2a1c0 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
2a1d0 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
2a1e0 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41  ab..**.** The pA
2a1f0 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75   side might be u
2a200 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
2a210 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
2a220 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73  e case and pB is
2a230 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b  .** not using TK
2a240 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73  _REGISTER but is
2a250 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76   otherwise equiv
2a260 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c  alent, then stil
2a270 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  l return 0..**.*
2a280 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
2a290 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
2a2a0 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
2a2b0 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
2a2c0 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
2a2d0 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
2a2e0 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
2a2f0 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
2a300 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
2a310 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
2a320 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
2a330 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
2a340 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
2a350 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
2a360 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
2a370 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
2a380 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
2a390 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
2a3a0 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
2a3b0 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
2a3c0 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
2a3d0 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
2a3e0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
2a3f0 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
2a400 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
2a410 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
2a420 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
2a430 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
2a440 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
2a450 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
2a460 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
2a470 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
2a480 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
2a490 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
2a4a0 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
2a4b0 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
2a4c0 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  alfunction..**.*
2a4d0 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e  * If pParse is n
2a4e0 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54 4b 5f  ot NULL then TK_
2a4f0 56 41 52 49 41 42 4c 45 20 74 65 72 6d 73 20 69  VARIABLE terms i
2a500 6e 20 70 41 20 77 69 74 68 20 62 69 6e 64 69 6e  n pA with bindin
2a510 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  gs in.** pParse-
2a520 3e 70 52 65 70 72 65 70 61 72 65 20 63 61 6e 20  >pReprepare can 
2a530 62 65 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e  be matched again
2a540 73 74 20 6c 69 74 65 72 61 6c 73 20 69 6e 20 70  st literals in p
2a550 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50 61 72  B.  The .** pPar
2a560 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61  se->pVdbe->expma
2a570 73 6b 20 62 69 74 6d 61 73 6b 20 69 73 20 75 70  sk bitmask is up
2a580 64 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 76  dated for each v
2a590 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63  ariable referenc
2a5a0 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72 73 65  ed..** If pParse
2a5b0 20 69 73 20 4e 55 4c 4c 20 28 74 68 65 20 6e 6f   is NULL (the no
2a5c0 72 6d 61 6c 20 63 61 73 65 29 20 74 68 65 6e 20  rmal case) then 
2a5d0 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c 45 20  any TK_VARIABLE 
2a5e0 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72 67 75  term in .** Argu
2a5f0 6d 65 6e 74 20 70 50 61 72 73 65 20 73 68 6f 75  ment pParse shou
2a600 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 4e  ld normally be N
2a610 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ULL. If it is no
2a620 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20 6f 72  t NULL and pA or
2a630 0a 2a 2a 20 70 42 20 63 61 75 73 65 73 20 61 20  .** pB causes a 
2a640 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
2a650 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  2..*/.int sqlite
2a660 33 45 78 70 72 43 6f 6d 70 61 72 65 28 50 61 72  3ExprCompare(Par
2a670 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2a680 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20   *pA, Expr *pB, 
2a690 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32  int iTab){.  u32
2a6a0 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a   combinedFlags;.
2a6b0 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
2a6c0 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  B==0 ){.    retu
2a6d0 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20  rn pB==pA ? 0 : 
2a6e0 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  2;.  }.  if( pPa
2a6f0 72 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d 3d 54  rse && pA->op==T
2a700 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20 65 78  K_VARIABLE && ex
2a710 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c  prCompareVariabl
2a720 65 28 70 50 61 72 73 65 2c 20 70 41 2c 20 70 42  e(pParse, pA, pB
2a730 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2a740 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65  0;.  }.  combine
2a750 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61  dFlags = pA->fla
2a760 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a  gs | pB->flags;.
2a770 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c    if( combinedFl
2a780 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
2a790 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41  e ){.    if( (pA
2a7a0 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67  ->flags&pB->flag
2a7b0 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  s&EP_IntValue)!=
2a7c0 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75  0 && pA->u.iValu
2a7d0 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20  e==pB->u.iValue 
2a7e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2a7f0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  0;.    }.    ret
2a800 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
2a810 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20   pA->op!=pB->op 
2a820 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
2a830 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
2a840 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2a850 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e  are(pParse, pA->
2a860 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c 32  pLeft,pB,iTab)<2
2a870 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2a880 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
2a890 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pB->op==TK_COL
2a8a0 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
2a8b0 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2a8c0 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74 2c  e, pA,pB->pLeft,
2a8d0 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
2a8e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2a8f0 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
2a900 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
2a910 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
2a920 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
2a930 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f  UMN && pA->u.zTo
2a940 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ken ){.    if( p
2a950 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  A->op==TK_FUNCTI
2a960 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ON ){.      if( 
2a970 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
2a980 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
2a990 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72  u.zToken)!=0 ) r
2a9a0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c  eturn 2;.    }el
2a9b0 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54  se if( pA->op==T
2a9c0 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20  K_COLLATE ){.   
2a9d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2a9e0 74 72 69 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  tricmp(pA->u.zTo
2a9f0 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
2aa00 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b  )!=0 ) return 2;
2aa10 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
2aa20 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b  trcmp(pA->u.zTok
2aa30 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  en,pB->u.zToken)
2aa40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
2aa50 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
2aa60 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
2aa70 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
2aa80 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
2aa90 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
2aaa0 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c  turn 2;.  if( AL
2aab0 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c  WAYS((combinedFl
2aac0 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ags & EP_TokenOn
2aad0 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69  ly)==0) ){.    i
2aae0 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
2aaf0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
2ab00 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2ab10 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2ab20 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2ab30 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
2ab40 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  eft, iTab) ) ret
2ab50 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
2ab60 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2ab70 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 52  e(pParse, pA->pR
2ab80 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
2ab90 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
2aba0 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
2abb0 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
2abc0 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20  re(pA->x.pList, 
2abd0 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pB->x.pList, iTa
2abe0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
2abf0 20 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62     assert( (comb
2ac00 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52  inedFlags & EP_R
2ac10 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
2ac20 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b    if( pA->op!=TK
2ac30 5f 53 54 52 49 4e 47 20 26 26 20 70 41 2d 3e 6f  _STRING && pA->o
2ac40 70 21 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 20  p!=TK_TRUEFALSE 
2ac50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  ){.      if( pA-
2ac60 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
2ac70 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32  olumn ) return 2
2ac80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  ;.      if( pA->
2ac90 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
2aca0 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70  le .       && (p
2acb0 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  A->iTable!=iTab 
2acc0 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61  || NEVER(pB->iTa
2acd0 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72  ble>=0)) ) retur
2ace0 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 2;.    }.  }. 
2acf0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2ad00 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
2ad10 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
2ad20 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
2ad30 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
2ad40 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65  l and .** non-ze
2ad50 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65  ro if they diffe
2ad60 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  r in any way..**
2ad70 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
2ad80 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
2ad90 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
2ada0 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
2adb0 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
2adc0 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
2add0 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
2ade0 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
2adf0 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
2ae00 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2ae10 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ne might return 
2ae20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75  non-zero for equ
2ae30 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74  ivalent ExprList
2ae40 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20  s.  The.** only 
2ae50 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  consequence will
2ae60 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74   be disabled opt
2ae70 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74  imizations.  But
2ae80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
2ae90 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75   must never retu
2aea0 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20  rn 0 if the two 
2aeb0 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
2aec0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20   are different, 
2aed0 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74  or.** a malfunct
2aee0 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e  ion will result.
2aef0 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
2af00 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e  pointers are con
2af10 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68  sidered to be th
2af20 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e  e same.  But a N
2af30 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61  ULL pointer.** a
2af40 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72  lways differs fr
2af50 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f  om a non-NULL po
2af60 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
2af70 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
2af80 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70  pare(ExprList *p
2af90 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c  A, ExprList *pB,
2afa0 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e   int iTab){.  in
2afb0 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
2afc0 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75   && pB==0 ) retu
2afd0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d  rn 0;.  if( pA==
2afe0 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74  0 || pB==0 ) ret
2aff0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d  urn 1;.  if( pA-
2b000 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70  >nExpr!=pB->nExp
2b010 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
2b020 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e  for(i=0; i<pA->n
2b030 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2b040 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70  Expr *pExprA = p
2b050 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  A->a[i].pExpr;. 
2b060 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20     Expr *pExprB 
2b070 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pB->a[i].pExpr
2b080 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b  ;.    if( pA->a[
2b090 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42  i].sortOrder!=pB
2b0a0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2b0b0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2b0c0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2b0d0 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72  Compare(0, pExpr
2b0e0 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29  A, pExprB, iTab)
2b0f0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
2b100 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2b110 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74  /*.** Like sqlit
2b120 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29 20  e3ExprCompare() 
2b130 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20 6f  except COLLATE o
2b140 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20  perators at the 
2b150 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72 65  top-level.** are
2b160 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74   ignored..*/.int
2b170 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2b180 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70 41  areSkip(Expr *pA
2b190 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
2b1a0 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20  iTab){.  return 
2b1b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2b1c0 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20 20 20  re(0,.          
2b1d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b     sqlite3ExprSk
2b1e0 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a 20  ipCollate(pA),. 
2b1f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2b200 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2b210 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20 20 20  te(pB),.        
2b220 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f       iTab);.}../
2b230 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
2b240 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65   if we can prove
2b250 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c   the pE2 will al
2b260 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20  ways be true if 
2b270 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20  pE1 is.** true. 
2b280 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
2b290 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c   we cannot compl
2b2a0 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72  ete the proof or
2b2b0 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a   if pE2 might.**
2b2c0 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d   be false.  Exam
2b2d0 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
2b2e0 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE1: x==5       
2b2f0 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
2b300 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72        Result: tr
2b310 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
2b320 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78  >0        pE2: x
2b330 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
2b340 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Result: false.**
2b350 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20       pE1: x=21  
2b360 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f       pE2: x=21 O
2b370 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c  R y=43     Resul
2b380 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
2b390 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70  E1: x!=123     p
2b3a0 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
2b3b0 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
2b3c0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
2b3d0 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20  =?1      pE2: x 
2b3e0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2b3f0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
2b400 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c     pE1: x IS NUL
2b410 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54  L  pE2: x IS NOT
2b420 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
2b430 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
2b440 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45  1: x IS ?2    pE
2b450 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2b460 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73      Reuslt: fals
2b470 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d  e.**.** When com
2b480 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e  paring TK_COLUMN
2b490 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70   nodes between p
2b4a0 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70  E1 and pE2, if p
2b4b0 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69  E2 has.** Expr.i
2b4c0 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73  Table<0 then ass
2b4d0 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62  ume a table numb
2b4e0 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62  er given by iTab
2b4f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73  ..**.** If pPars
2b500 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
2b510 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f  hen the values o
2b520 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65  f bound variable
2b530 73 20 69 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a  s in pE1 are .**
2b540 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73   compared agains
2b550 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73  t literal values
2b560 20 69 6e 20 70 45 32 20 61 6e 64 20 70 50 61 72   in pE2 and pPar
2b570 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61  se->pVdbe->expma
2b580 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65  sk is.** modifie
2b590 64 20 74 6f 20 72 65 63 6f 72 64 20 77 68 69 63  d to record whic
2b5a0 68 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65  h bound variable
2b5b0 73 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64  s are referenced
2b5c0 2e 20 20 49 66 20 70 50 61 72 73 65 20 0a 2a 2a  .  If pParse .**
2b5d0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66   is NULL, then f
2b5e0 61 6c 73 65 20 77 69 6c 6c 20 62 65 20 72 65 74  alse will be ret
2b5f0 75 72 6e 65 64 20 69 66 20 70 45 31 20 63 6f 6e  urned if pE1 con
2b600 74 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20  tains any bound 
2b610 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
2b620 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   When in doubt, 
2b630 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52  return false.  R
2b640 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69  eturning true mi
2b650 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
2b660 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76  rmance.** improv
2b670 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e  ement.  Returnin
2b680 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61  g false might ca
2b690 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  use a performanc
2b6a0 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74  e reduction, but
2b6b0 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61  .** it will alwa
2b6c0 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72  ys give the corr
2b6d0 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69  ect answer and i
2b6e0 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73  s hence always s
2b6f0 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  afe..*/.int sqli
2b700 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
2b710 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pr(Parse *pParse
2b720 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70  , Expr *pE1, Exp
2b730 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62  r *pE2, int iTab
2b740 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
2b750 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2b760 73 65 2c 20 70 45 31 2c 20 70 45 32 2c 20 69 54  se, pE1, pE2, iT
2b770 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ab)==0 ){.    re
2b780 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
2b790 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  ( pE2->op==TK_OR
2b7a0 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45  .   && (sqlite3E
2b7b0 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
2b7c0 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2b7d0 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20  >pLeft, iTab).  
2b7e0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2b7f0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2b800 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 31  Expr(pParse, pE1
2b810 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69  , pE2->pRight, i
2b820 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20  Tab) ).  ){.    
2b830 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2b840 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
2b850 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  NOTNULL && pE1->
2b860 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26  op!=TK_ISNULL &&
2b870 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 20   pE1->op!=TK_IS 
2b880 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20  ){.    Expr *pX 
2b890 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2b8a0 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e 70 4c  pCollate(pE1->pL
2b8b0 65 66 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  eft);.    testca
2b8c0 73 65 28 20 70 58 21 3d 70 45 31 2d 3e 70 4c 65  se( pX!=pE1->pLe
2b8d0 66 74 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ft );.    if( sq
2b8e0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2b8f0 28 70 50 61 72 73 65 2c 20 70 58 2c 20 70 45 32  (pParse, pX, pE2
2b900 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d  ->pLeft, iTab)==
2b910 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
2b920 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2b930 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
2b940 68 65 20 45 78 70 72 20 6e 6f 64 65 20 63 61 6c  he Expr node cal
2b950 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c 69 74 65  lback for sqlite
2b960 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e  3ExprImpliesNotN
2b970 75 6c 6c 52 6f 77 28 29 2e 0a 2a 2a 20 49 66 20  ullRow()..** If 
2b980 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2b990 6f 64 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ode requires tha
2b9a0 74 20 74 68 65 20 74 61 62 6c 65 20 61 74 20 70  t the table at p
2b9b0 57 61 6c 6b 65 72 2d 3e 69 43 75 72 0a 2a 2a 20  Walker->iCur.** 
2b9c0 68 61 76 65 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  have a non-NULL 
2b9d0 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 73 65 74  column, then set
2b9e0 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
2b9f0 74 6f 20 31 20 61 6e 64 20 61 62 6f 72 74 2e 0a  to 1 and abort..
2ba00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6d  */.static int im
2ba10 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28  pliesNotNullRow(
2ba20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2ba30 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2ba40 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
2ba50 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
2ba60 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
2ba70 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
2ba80 20 73 6f 20 69 74 0a 20 20 2a 2a 20 63 61 6e 6e   so it.  ** cann
2ba90 6f 74 20 68 61 76 65 20 61 6e 79 20 54 4b 5f 41  ot have any TK_A
2baa0 47 47 5f 43 4f 4c 55 4d 4e 20 65 6e 74 72 69 65  GG_COLUMN entrie
2bab0 73 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  s because those 
2bac0 61 72 65 20 6f 6e 6c 79 20 66 6f 75 6e 64 0a 20  are only found. 
2bad0 20 2a 2a 20 69 6e 20 48 41 56 49 4e 47 20 63 6c   ** in HAVING cl
2bae0 61 75 73 65 73 2e 20 20 57 65 20 63 61 6e 20 67  auses.  We can g
2baf0 65 74 20 61 20 54 4b 5f 41 47 47 5f 46 55 4e 43  et a TK_AGG_FUNC
2bb00 54 49 4f 4e 20 69 6e 20 61 20 57 48 45 52 45 20  TION in a WHERE 
2bb10 63 6c 61 75 73 65 2c 0a 20 20 2a 2a 20 62 75 74  clause,.  ** but
2bb20 20 74 68 61 74 20 69 73 20 61 6e 20 69 6c 6c 65   that is an ille
2bb30 67 61 6c 20 63 6f 6e 73 74 72 75 63 74 20 61 6e  gal construct an
2bb40 64 20 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c  d the query will
2bb50 20 62 65 20 72 65 6a 65 63 74 65 64 20 61 74 0a   be rejected at.
2bb60 20 20 2a 2a 20 61 20 6c 61 74 65 72 20 73 74 61    ** a later sta
2bb70 67 65 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67  ge of processing
2bb80 2c 20 73 6f 20 74 68 65 20 54 4b 5f 41 47 47 5f  , so the TK_AGG_
2bb90 46 55 4e 43 54 49 4f 4e 20 63 61 73 65 20 64 6f  FUNCTION case do
2bba0 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 65 64  es not.  ** need
2bbb0 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65   to be considere
2bbc0 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20 61 73 73  d here. */.  ass
2bbd0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
2bbe0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
2bbf0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78  .  testcase( pEx
2bc00 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
2bc10 55 4e 43 54 49 4f 4e 20 29 3b 0a 0a 20 20 69 66  UNCTION );..  if
2bc20 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2bc30 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
2bc40 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 57  Join) ) return W
2bc50 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73 77 69 74  RC_Prune;.  swit
2bc60 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
2bc70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
2bc80 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
2bc90 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
2bca0 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
2bcb0 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
2bcc0 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
2bcd0 65 20 54 4b 5f 43 41 53 45 3a 0a 20 20 20 20 63  e TK_CASE:.    c
2bce0 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63  ase TK_IN:.    c
2bcf0 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
2bd00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2bd10 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2bd20 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65  SNOT );.      te
2bd30 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2bd40 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
2bd50 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2bd60 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  pr->op==TK_ISNUL
2bd70 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
2bd80 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2bd90 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
2bda0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2bdb0 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20  op==TK_OR );.   
2bdc0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2bdd0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53 45 20  pr->op==TK_CASE 
2bde0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2bdf0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2be00 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IN );.      tes
2be10 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2be20 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  ==TK_FUNCTION );
2be30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
2be40 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 63 61 73  C_Prune;.    cas
2be50 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
2be60 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
2be70 75 2e 69 43 75 72 3d 3d 70 45 78 70 72 2d 3e 69  u.iCur==pExpr->i
2be80 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
2be90 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
2bea0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
2beb0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2bec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2bed0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 0a  urn WRC_Prune;..
2bee0 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
2bef0 61 62 6c 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  ables are allowe
2bf00 64 20 74 6f 20 75 73 65 20 63 6f 6e 73 74 72 61  d to use constra
2bf10 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e 55 4c 4c  ints like x=NULL
2bf20 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 61 20 74  .  So.    ** a t
2bf30 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
2bf40 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f  x=y does not pro
2bf50 76 65 20 74 68 61 74 20 79 20 69 73 20 6e 6f 74  ve that y is not
2bf60 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20 20 20 2a   null if x.    *
2bf70 2a 20 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * is the column 
2bf80 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  of a virtual tab
2bf90 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  le */.    case T
2bfa0 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65 20 54  K_EQ:.    case T
2bfb0 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
2bfc0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
2bfd0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
2bfe0 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
2bff0 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74 65 73 74  K_GE:.      test
2c000 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2c010 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =TK_EQ );.      
2c020 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2c030 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20  >op==TK_NE );.  
2c040 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c050 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29  xpr->op==TK_LT )
2c060 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2c070 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c080 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LE );.      test
2c090 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2c0a0 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
2c0b0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2c0c0 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20  >op==TK_GE );.  
2c0d0 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e      if( (pExpr->
2c0e0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pLeft->op==TK_CO
2c0f0 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61  LUMN && IsVirtua
2c100 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  l(pExpr->pLeft->
2c110 70 54 61 62 29 29 0a 20 20 20 20 20 20 20 7c 7c  pTab)).       ||
2c120 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d   (pExpr->pRight-
2c130 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
2c140 26 20 49 73 56 69 72 74 75 61 6c 28 70 45 78 70  & IsVirtual(pExp
2c150 72 2d 3e 70 52 69 67 68 74 2d 3e 70 54 61 62 29  r->pRight->pTab)
2c160 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2c170 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2c180 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
2c190 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
2c1a0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2c1b0 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ue;.  }.}../*.**
2c1c0 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f   Return true (no
2c1d0 6e 2d 7a 65 72 6f 29 20 69 66 20 65 78 70 72 65  n-zero) if expre
2c1e0 73 73 69 6f 6e 20 70 20 63 61 6e 20 6f 6e 6c 79  ssion p can only
2c1f0 20 62 65 20 74 72 75 65 20 69 66 20 61 74 20 6c   be true if at l
2c200 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f 6c 75  east.** one colu
2c210 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 54 61 62  mn of table iTab
2c220 20 69 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20 20 49   is non-null.  I
2c230 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
2c240 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
2c250 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69   expression p wi
2c260 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 4e 55 4c  ll always be NUL
2c270 4c 20 6f 72 20 66 61 6c 73 65 20 69 66 20 65 76  L or false if ev
2c280 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54  ery column of iT
2c290 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a  ab.** is NULL..*
2c2a0 2a 0a 2a 2a 20 46 61 6c 73 65 20 6e 65 67 61 74  *.** False negat
2c2b0 69 76 65 73 20 61 72 65 20 61 63 63 65 70 74 61  ives are accepta
2c2c0 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
2c2d0 6f 72 64 73 2c 20 69 74 20 69 73 20 6f 6b 20 74  ords, it is ok t
2c2e0 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f  o return.** zero
2c2f0 20 65 76 65 6e 20 69 66 20 65 78 70 72 65 73 73   even if express
2c300 69 6f 6e 20 70 20 77 69 6c 6c 20 6e 65 76 65 72  ion p will never
2c310 20 62 65 20 74 72 75 65 20 6f 66 20 65 76 65 72   be true of ever
2c320 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62  y column of iTab
2c330 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20  .** is NULL.  A 
2c340 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 69  false negative i
2c350 73 20 6d 65 72 65 6c 79 20 61 20 6d 69 73 73 65  s merely a misse
2c360 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  d optimization o
2c370 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2a 0a 2a  pportunity..**.*
2c380 2a 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65  * False positive
2c390 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
2c3a0 64 2c 20 68 6f 77 65 76 65 72 2e 20 20 41 20 66  d, however.  A f
2c3b0 61 6c 73 65 20 70 6f 73 69 74 69 76 65 20 6d 61  alse positive ma
2c3c0 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  y result.** in a
2c3d0 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77  n incorrect answ
2c3e0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  er..**.** Terms 
2c3f0 6f 66 20 70 20 74 68 61 74 20 61 72 65 20 6d 61  of p that are ma
2c400 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46 72 6f  rked with EP_Fro
2c410 6d 4a 6f 69 6e 20 28 61 6e 64 20 68 65 6e 63 65  mJoin (and hence
2c420 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 0a   that come from.
2c430 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  ** the ON or USI
2c440 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 4c 45  NG clauses of LE
2c450 46 54 20 4a 4f 49 4e 53 29 20 61 72 65 20 65 78  FT JOINS) are ex
2c460 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cluded from the 
2c470 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20  analysis..**.** 
2c480 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2c490 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
2c4a0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e   a LEFT JOIN can
2c4b0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
2c4c0 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  to.** an ordinar
2c4d0 79 20 4a 4f 49 4e 2e 20 20 54 68 65 20 70 20 61  y JOIN.  The p a
2c4e0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 57  rgument is the W
2c4f0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 49 66  HERE clause.  If
2c500 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c   the WHERE.** cl
2c510 61 75 73 65 20 72 65 71 75 69 72 65 73 20 74 68  ause requires th
2c520 61 74 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e 20 6f  at some column o
2c530 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
2c540 65 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f  e of the LEFT JO
2c550 49 4e 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e 55 4c  IN.** be non-NUL
2c560 4c 2c 20 74 68 65 6e 20 74 68 65 20 4c 45 46 54  L, then the LEFT
2c570 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 73 61 66   JOIN can be saf
2c580 65 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  ely converted in
2c590 74 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  to an.** ordinar
2c5a0 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  y join..*/.int s
2c5b0 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2c5c0 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78 70 72  sNonNullRow(Expr
2c5d0 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a   *p, int iTab){.
2c5e0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
2c5f0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2c600 69 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f  impliesNotNullRo
2c610 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
2c620 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e  llback = 0;.  w.
2c630 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2c640 20 3d 20 30 3b 0a 20 20 77 2e 65 43 6f 64 65 20   = 0;.  w.eCode 
2c650 3d 20 30 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20  = 0;.  w.u.iCur 
2c660 3d 20 69 54 61 62 3b 0a 20 20 73 71 6c 69 74 65  = iTab;.  sqlite
2c670 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
2c680 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
2c690 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  de;.}../*.** An 
2c6a0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2c6b0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2c6c0 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
2c6d0 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
2c6e0 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  * to determine i
2c6f0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
2c700 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64  can be evaluated
2c710 20 62 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f   by reference to
2c720 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e   the.** index on
2c730 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69  ly, without havi
2c740 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63  ng to do a searc
2c750 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73  h for the corres
2c760 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65  ponding.** table
2c770 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78   entry.  The Idx
2c780 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64  Cover.pIdx field
2c790 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20   is the index.  
2c7a0 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a  IdxCover.iCur.**
2c7b0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
2c7c0 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  or the table..*/
2c7d0 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72  .struct IdxCover
2c7e0 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78   {.  Index *pIdx
2c7f0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64  ;     /* The ind
2c800 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ex to be tested 
2c810 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  for coverage */.
2c820 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
2c830 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
2c840 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
2c850 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2c860 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  to the index */.
2c870 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  };../*.** Check 
2c880 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
2c890 61 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  are references t
2c8a0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  o columns in tab
2c8b0 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e  le .** pWalker->
2c8c0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
2c8d0 72 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69  r can be satisfi
2c8e0 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64  ed using the ind
2c8f0 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75  ex.** pWalker->u
2c900 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78  .pIdxCover->pIdx
2c910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c920 65 78 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c  exprIdxCover(Wal
2c930 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2c940 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66  pr *pExpr){.  if
2c950 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c960 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78  COLUMN.   && pEx
2c970 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c  pr->iTable==pWal
2c980 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2c990 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c  ->iCur.   && sql
2c9a0 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
2c9b0 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  x(pWalker->u.pId
2c9c0 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45  xCover->pIdx, pE
2c9d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a  xpr->iColumn)<0.
2c9e0 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72    ){.    pWalker
2c9f0 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ->eCode = 1;.   
2ca00 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2ca10 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
2ca20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2ca30 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
2ca40 20 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64   if an index pId
2ca50 78 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20  x on table with 
2ca60 63 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74  cursor iCur cont
2ca70 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65  ains will.** the
2ca80 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
2ca90 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  r.  Return true 
2caa0 69 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65  if the index doe
2cab0 73 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65  s cover the.** e
2cac0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61  xpression and fa
2cad0 6c 73 65 20 69 66 20 74 68 65 20 70 45 78 70 72  lse if the pExpr
2cae0 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65   expression refe
2caf0 72 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c  rences table col
2cb00 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  umns.** that are
2cb10 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68   not found in th
2cb20 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  e index pIdx..**
2cb30 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76  .** An index cov
2cb40 65 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  ering an express
2cb50 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ion means that t
2cb60 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
2cb70 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65  n be.** evaluate
2cb80 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65  d using only the
2cb90 20 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f   index and witho
2cba0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f  ut having to loo
2cbb0 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  kup the.** corre
2cbc0 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65  sponding table e
2cbd0 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ntry..*/.int sql
2cbe0 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42  ite3ExprCoveredB
2cbf0 79 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a  yIndex(.  Expr *
2cc00 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
2cc10 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
2cc20 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
2cc30 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
2cc40 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e   /* The cursor n
2cc50 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f  umber for the co
2cc60 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
2cc70 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
2cc80 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  dx         /* Th
2cc90 65 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67  e index that mig
2cca0 68 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 63  ht be used for c
2ccb0 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  overage */.){.  
2ccc0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75  Walker w;.  stru
2ccd0 63 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76  ct IdxCover xcov
2cce0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
2ccf0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
2cd00 78 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72  xcov.iCur = iCur
2cd10 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20  ;.  xcov.pIdx = 
2cd20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43  pIdx;.  w.xExprC
2cd30 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64  allback = exprId
2cd40 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49  xCover;.  w.u.pI
2cd50 64 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b  dxCover = &xcov;
2cd60 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2cd70 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20  pr(&w, pExpr);. 
2cd80 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65   return !w.eCode
2cd90 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ;.}.../*.** An i
2cda0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2cdb0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2cdc0 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
2cdd0 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
2cde0 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65   to count refere
2cdf0 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f  nces to table co
2ce00 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67  lumns in the arg
2ce10 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a  uments of an .**
2ce20 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2ce30 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ion, in order to
2ce40 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
2ce50 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
2ce60 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69  nThisSrc() routi
2ce70 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72  ne..*/.struct Sr
2ce80 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69  cCount {.  SrcLi
2ce90 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f  st *pSrc;   /* O
2cea0 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52  ne particular FR
2ceb0 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e  OM clause in a n
2cec0 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20  ested query */. 
2ced0 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20   int nThis;     
2cee0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2cef0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2cf00 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74  umns in pSrcList
2cf10 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72   */.  int nOther
2cf20 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
2cf30 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
2cf40 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68  o columns in oth
2cf50 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20  er FROM clauses 
2cf60 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  */.};../*.** Cou
2cf70 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
2cf80 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
2cf90 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
2cfa0 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75  c int exprSrcCou
2cfb0 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
2cfc0 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
2cfd0 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52  {.  /* The NEVER
2cfe0 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  () on the second
2cff0 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65   term is because
2d000 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2d010 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20  UsesThisSrc().  
2d020 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c  ** is always cal
2d030 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74  led before sqlit
2d040 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2d050 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f  regates() and so
2d060 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c   the.  ** TK_COL
2d070 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65  UMNs have not ye
2d080 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  t been converted
2d090 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
2d0a0 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71  UMN.  If.  ** sq
2d0b0 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
2d0c0 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73  sThisSrc() is us
2d0d0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69  ed differently i
2d0e0 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
2d0f0 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77  e.  ** NEVER() w
2d100 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ill need to be r
2d110 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28  emoved. */.  if(
2d120 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
2d130 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70  OLUMN || NEVER(p
2d140 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
2d150 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20  _COLUMN) ){.    
2d160 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
2d170 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20  t SrcCount *p = 
2d180 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43  pWalker->u.pSrcC
2d190 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  ount;.    SrcLis
2d1a0 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
2d1b0 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20  c;.    int nSrc 
2d1c0 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e  = pSrc ? pSrc->n
2d1d0 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72  Src : 0;.    for
2d1e0 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b  (i=0; i<nSrc; i+
2d1f0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
2d200 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
2d210 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
2d220 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
2d230 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b     if( i<nSrc ){
2d240 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b  .      p->nThis+
2d250 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
2d260 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b      p->nOther++;
2d270 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2d280 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2d290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
2d2a0 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74  mine if any of t
2d2b0 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
2d2c0 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69  the pExpr Functi
2d2d0 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  on reference.** 
2d2e0 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72  pSrcList.  Retur
2d2f0 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64  n true if they d
2d300 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20  o.  Also return 
2d310 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63  true if the func
2d320 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61  tion.** has no a
2d330 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20  rguments or has 
2d340 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72  only constant ar
2d350 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
2d360 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a   false if pExpr.
2d370 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f  ** references co
2d380 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f  lumns but not co
2d390 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20  lumns of tables 
2d3a0 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73  found in pSrcLis
2d3b0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2d3c0 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
2d3d0 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72  sSrc(Expr *pExpr
2d3e0 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c  , SrcList *pSrcL
2d3f0 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ist){.  Walker w
2d400 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f  ;.  struct SrcCo
2d410 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72  unt cnt;.  asser
2d420 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
2d430 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
2d440 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2d450 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e  ck = exprSrcCoun
2d460 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  t;.  w.xSelectCa
2d470 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e  llback = 0;.  w.
2d480 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63  u.pSrcCount = &c
2d490 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d  nt;.  cnt.pSrc =
2d4a0 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74   pSrcList;.  cnt
2d4b0 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e  .nThis = 0;.  cn
2d4c0 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20  t.nOther = 0;.  
2d4d0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
2d4e0 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78  ist(&w, pExpr->x
2d4f0 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  .pList);.  retur
2d500 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c  n cnt.nThis>0 ||
2d510 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a   cnt.nOther==0;.
2d520 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
2d530 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
2d540 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
2d550 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
2d560 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
2d570 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
2d580 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
2d590 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
2d5a0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
2d5b0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
2d5c0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
2d5d0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
2d5e0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
2d5f0 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
2d600 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
2d610 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
2d620 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
2d630 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
2d640 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
2d650 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  ol[0]),.       &
2d660 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
2d670 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
2d680 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
2d690 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
2d6a0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
2d6b0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2d6c0 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
2d6d0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
2d6e0 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
2d6f0 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
2d700 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
2d710 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
2d720 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
2d730 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74  ggInfoFunc(sqlit
2d740 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
2d750 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
2d760 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  ;.  pInfo->aFunc
2d770 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
2d780 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
2d790 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66  db, .       pInf
2d7a0 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->aFunc,.      
2d7b0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
2d7c0 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20  Func[0]),.      
2d7d0 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
2d7e0 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
2d7f0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
2d800 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2d810 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63  the xExprCallbac
2d820 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c  k for a tree wal
2d830 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64  ker.  It is used
2d840 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
2d850 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2d860 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
2d870 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
2d880 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2d890 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
2d8a0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
2d8b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d8c0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2d8d0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2d8e0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2d8f0 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
2d900 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
2d910 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
2d920 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
2d930 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
2d940 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
2d950 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
2d960 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
2d970 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 75 4e 43  gInfo = pNC->uNC
2d980 2e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 61 73  .pAggInfo;..  as
2d990 73 65 72 74 28 20 70 4e 43 2d 3e 6e 63 46 6c 61  sert( pNC->ncFla
2d9a0 67 73 20 26 20 4e 43 5f 55 41 67 67 49 6e 66 6f  gs & NC_UAggInfo
2d9b0 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   );.  switch( pE
2d9c0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
2d9d0 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
2d9e0 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
2d9f0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74  OLUMN: {.      t
2da00 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2da10 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2da20 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
2da30 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2da40 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
2da50 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
2da60 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ee if the column
2da70 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68   is in one of th
2da80 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
2da90 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c  FROM.      ** cl
2daa0 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
2dab0 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20  egate query */. 
2dac0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
2dad0 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a  pSrcList!=0) ){.
2dae0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
2daf0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2db00 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
2db10 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2db20 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
2db30 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
2db40 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
2db50 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
2db60 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20   *pCol;.        
2db70 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2db80 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2db90 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2dba0 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
2dbb0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
2dbc0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
2dbd0 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->iCursor ){.   
2dbe0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
2dbf0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
2dc00 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
2dc10 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74  t pExpr refers t
2dc20 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  o a table.      
2dc30 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
2dc40 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2dc50 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
2dc60 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20  gate query.  .  
2dc70 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2dc80 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65           ** Make
2dc90 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
2dca0 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67  e column in pAgg
2dcb0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20  Info->aCol[] if 
2dcc0 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
2dcd0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65    ** is not an e
2dce0 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61  ntry there alrea
2dcf0 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy..            
2dd00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
2dd10 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
2dd20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66    pCol = pAggInf
2dd30 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  o->aCol;.       
2dd40 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
2dd50 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
2dd60 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  n; k++, pCol++){
2dd70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2dd80 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d  f( pCol->iTable=
2dd90 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
2dda0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
2ddb0 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
2ddc0 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
2ddd0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2dde0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2ddf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2de00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2de10 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41        if( (k>=pA
2de20 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29  ggInfo->nColumn)
2de30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2de40 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f   (k = addAggInfo
2de50 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64  Column(pParse->d
2de60 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30  b, pAggInfo))>=0
2de70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
2de80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2de90 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
2dea0 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  >aCol[k];.      
2deb0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
2dec0 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
2ded0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2dee0 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pCol->iTable = p
2def0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
2df00 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2df10 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ->iColumn = pExp
2df20 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
2df30 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2df40 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
2df50 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
2df60 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2df70 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  erColumn = -1;. 
2df80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2df90 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  l->pExpr = pExpr
2dfa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2dfb0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  if( pAggInfo->pG
2dfc0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
2dfd0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c            int j,
2dfe0 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
2dff0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
2e000 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  B = pAggInfo->pG
2e010 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
2e020 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
2e030 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
2e040 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20  erm = pGB->a;.  
2e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
2e060 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pGB->nExpr;.  
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
2e080 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c  r(j=0; j<n; j++,
2e090 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
2e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
2e0b0 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pE = pTerm->p
2e0c0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2e0d0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
2e0e0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
2e0f0 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78   pE->iTable==pEx
2e100 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
2e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e120 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d      pE->iColumn=
2e130 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
2e140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e150 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
2e160 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  rterColumn = j;.
2e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e180 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2e190 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2e1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2e1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2e1d0 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
2e1e0 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
2e1f0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2e200 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
2e210 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72  = pAggInfo->nSor
2e220 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20  tingColumn++;.  
2e230 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e240 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e250 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
2e260 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79   is now an entry
2e270 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41   for pExpr in pA
2e280 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28  ggInfo->aCol[] (
2e290 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20  either.         
2e2a0 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74     ** because it
2e2b0 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72   was there befor
2e2c0 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20  e or because we 
2e2d0 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29  just created it)
2e2e0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
2e2f0 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78   Convert the pEx
2e300 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47  pr to be a TK_AG
2e310 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69  G_COLUMN referri
2e320 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20  ng to that.     
2e330 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e         ** pAggIn
2e340 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79  fo->aCol[] entry
2e350 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
2e360 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
2e370 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2e380 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
2e390 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ce);.           
2e3a0 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
2e3b0 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
2e3c0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2e3d0 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
2e3e0 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
2e3f0 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
2e400 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  16)k;.          
2e410 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2e420 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
2e430 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
2e440 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
2e450 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
2e460 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
2e470 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
2e480 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2e490 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
2e4a0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
2e4b0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  TION: {.      if
2e4c0 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  ( (pNC->ncFlags 
2e4d0 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d  & NC_InAggFunc)=
2e4e0 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57 61  =0.       && pWa
2e4f0 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74  lker->walkerDept
2e500 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20  h==pExpr->op2.  
2e510 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
2e520 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2e530 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70  f pExpr is a dup
2e540 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65  licate of anothe
2e550 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20  r aggregate .   
2e560 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
2e570 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79   that is already
2e580 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f   in the pAggInfo
2e590 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20   structure.     
2e5a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74     */.        st
2e5b0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2e5c0 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49  c *pItem = pAggI
2e5d0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20  nfo->aFunc;.    
2e5e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2e5f0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2e600 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2e610 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2e620 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2e630 30 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  0, pItem->pExpr,
2e640 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29   pExpr, -1)==0 )
2e650 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
2e660 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2e670 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e680 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e     if( i>=pAggIn
2e690 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20  fo->nFunc ){.   
2e6a0 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20         /* pExpr 
2e6b0 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61  is original.  Ma
2e6c0 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ke a new entry i
2e6d0 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  n pAggInfo->aFun
2e6e0 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  c[].          */
2e6f0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e  .          u8 en
2e700 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
2e710 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  db);.          i
2e720 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e   = addAggInfoFun
2e730 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  c(pParse->db, pA
2e740 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
2e750 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20     if( i>=0 ){. 
2e760 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2e770 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2e780 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
2e790 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
2e7a0 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20          pItem = 
2e7b0 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  &pAggInfo->aFunc
2e7c0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
2e7d0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
2e7e0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
2e7f0 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d     pItem->iMem =
2e800 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2e810 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
2e820 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2e830 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2e840 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
2e850 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2e860 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46  pFunc = sqlite3F
2e870 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
2e880 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
2e890 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2e8a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20  ->u.zToken, .   
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f  pExpr->x.pList ?
2e8d0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
2e8e0 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c  >nExpr : 0, enc,
2e8f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2e900 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
2e910 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20  s & EP_Distinct 
2e920 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e930 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
2e940 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
2e950 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2e960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2e970 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
2e980 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
2e990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e9a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2e9b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
2e9c0 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74  pExpr point to t
2e9d0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
2e9e0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
2e9f0 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a   entry.        *
2ea00 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
2ea10 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2ea20 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
2ea30 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
2ea40 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  d) );.        Ex
2ea50 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2ea60 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
2ea70 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45  uce);.        pE
2ea80 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36  xpr->iAgg = (i16
2ea90 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  )i;.        pExp
2eaa0 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
2eab0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
2eac0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2ead0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2eae0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2eaf0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
2eb00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2eb10 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2eb20 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  nue;.}.static in
2eb30 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
2eb40 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b  tesInSelect(Walk
2eb50 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2eb60 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
2eb70 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2eb80 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57  R(pSelect);.  pW
2eb90 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
2eba0 74 68 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 57  th++;.  return W
2ebb0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
2ebc0 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79  tatic void analy
2ebd0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2ebe0 6c 65 63 74 45 6e 64 28 57 61 6c 6b 65 72 20 2a  lectEnd(Walker *
2ebf0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2ec00 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55  *pSelect){.  UNU
2ec10 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53  SED_PARAMETER(pS
2ec20 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65  elect);.  pWalke
2ec30 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2d 2d  r->walkerDepth--
2ec40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
2ec50 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70  ze the pExpr exp
2ec60 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
2ec70 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
2ec80 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
2ec90 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
2eca0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
2ecb0 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62  ed to AggInfo ob
2ecc0 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70  ject that pNC->p
2ecd0 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74  AggInfo.** point
2ece0 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61  s to.  Additiona
2ecf0 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61  l entries are ma
2ed00 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66  de on the AggInf
2ed10 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e  o object as.** n
2ed20 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
2ed30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
2ed40 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2ed50 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70  ed after the exp
2ed60 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e  ression has been
2ed70 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20  .** analyzed by 
2ed80 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
2ed90 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f  prNames()..*/.vo
2eda0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
2edb0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2edc0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
2edd0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2ede0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
2edf0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2ee00 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2ee10 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2ee20 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
2ee30 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
2ee40 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  t;.  w.xSelectCa
2ee50 6c 6c 62 61 63 6b 32 20 3d 20 61 6e 61 6c 79 7a  llback2 = analyz
2ee60 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
2ee70 65 63 74 45 6e 64 3b 0a 20 20 77 2e 77 61 6c 6b  ectEnd;.  w.walk
2ee80 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 77  erDepth = 0;.  w
2ee90 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20  .u.pNC = pNC;.  
2eea0 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
2eeb0 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71  cList!=0 );.  sq
2eec0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
2eed0 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
2eee0 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
2eef0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2ef00 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
2ef10 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
2ef20 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
2ef30 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
2ef40 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2ef50 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
2ef60 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
2ef70 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
2ef80 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f  cut short..*/.vo
2ef90 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
2efa0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
2efb0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
2efc0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
2efd0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
2efe0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2eff0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
2f000 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
2f010 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
2f020 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
2f030 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
2f040 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
2f050 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2f060 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
2f070 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
2f080 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
2f090 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20  locate a single 
2f0a0 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72  new register for
2f0b0 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d   use to hold som
2f0c0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  e intermediate r
2f0d0 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  esult..*/.int sq
2f0e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2f0f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
2f100 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
2f110 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  empReg==0 ){.   
2f120 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65   return ++pParse
2f130 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65  ->nMem;.  }.  re
2f140 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65  turn pParse->aTe
2f150 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e  mpReg[--pParse->
2f160 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a  nTempReg];.}../*
2f170 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
2f180 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e   register, makin
2f190 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  g available for 
2f1a0 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f  reuse for some o
2f1b0 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e  ther.** purpose.
2f1c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
2f1d0 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ster is currentl
2f1e0 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20  y being used by 
2f1f0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
2f200 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65  , then.** the de
2f210 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65  allocation is de
2f220 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
2f230 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69   column cache li
2f240 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20  ne that uses.** 
2f250 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63  the register bec
2f260 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76  omes stale..*/.v
2f270 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
2f280 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  seTempReg(Parse 
2f290 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
2f2a0 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26  g){.  if( iReg &
2f2b0 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  & pParse->nTempR
2f2c0 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
2f2d0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
2f2e0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2f2f0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
2f300 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d  e *p;.    for(i=
2f310 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
2f320 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
2f330 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
2f340 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , p++){.      if
2f350 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
2f360 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65  ){.        p->te
2f370 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20  mpReg = 1;.     
2f380 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
2f390 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
2f3a0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
2f3b0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
2f3c0 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  ] = iReg;.  }.}.
2f3d0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2f3e0 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20  or deallocate a 
2f3f0 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f  block of nReg co
2f400 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
2f410 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ers..*/.int sqli
2f420 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
2f430 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2f440 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
2f450 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67  i, n;.  if( nReg
2f460 3d 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c  ==1 ) return sql
2f470 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
2f480 50 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50  Parse);.  i = pP
2f490 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b  arse->iRangeReg;
2f4a0 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .  n = pParse->n
2f4b0 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20  RangeReg;.  if( 
2f4c0 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61  nReg<=n ){.    a
2f4d0 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f  ssert( !usedAsCo
2f4e0 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
2f4f0 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20  , i, i+n-1) );. 
2f500 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
2f510 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  eReg += nReg;.  
2f520 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
2f530 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d  Reg -= nReg;.  }
2f540 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50  else{.    i = pP
2f550 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
2f560 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
2f570 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65  = nReg;.  }.  re
2f580 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73  turn i;.}.void s
2f590 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2f5a0 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
2f5b0 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
2f5c0 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28  int nReg){.  if(
2f5d0 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nReg==1 ){.    
2f5e0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2f5f0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52  mpReg(pParse, iR
2f600 65 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  eg);.    return;
2f610 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
2f620 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
2f630 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67  arse, iReg, nReg
2f640 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50  );.  if( nReg>pP
2f650 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2f660 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
2f670 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b  RangeReg = nReg;
2f680 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
2f690 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ngeReg = iReg;. 
2f6a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b   }.}../*.** Mark
2f6b0 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72   all temporary r
2f6c0 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69 6e  egisters as bein
2f6d0 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f  g unavailable fo
2f6e0 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64  r reuse..*/.void
2f6f0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
2f700 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65 20  pRegCache(Parse 
2f710 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72  *pParse){.  pPar
2f720 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30  se->nTempReg = 0
2f730 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  ;.  pParse->nRan
2f740 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  geReg = 0;.}../*
2f750 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68 61  .** Validate tha
2f760 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20 72  t no temporary r
2f770 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77 69  egister falls wi
2f780 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f  thin the range o
2f790 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61  f.** iFirst..iLa
2f7a0 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20  st, inclusive.  
2f7b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2f7c0 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77  only call from w
2f7d0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a 2a  ithin assert().*
2f7e0 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  * statements..*/
2f7f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2f800 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
2f810 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 50  NoTempsInRange(P
2f820 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2f830 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69 4c  t iFirst, int iL
2f840 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ast){.  int i;. 
2f850 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52 61   if( pParse->nRa
2f860 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20 70  ngeReg>0.   && p
2f870 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2f880 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  +pParse->nRangeR
2f890 65 67 20 3e 20 69 46 69 72 73 74 0a 20 20 20 26  eg > iFirst.   &
2f8a0 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  & pParse->iRange
2f8b0 52 65 67 20 3c 3d 20 69 4c 61 73 74 0a 20 20 29  Reg <= iLast.  )
2f8c0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
2f8d0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
2f8e0 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  i<pParse->nTempR
2f8f0 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  eg; i++){.    if
2f900 28 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  ( pParse->aTempR
2f910 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26  eg[i]>=iFirst &&
2f920 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2f930 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20  g[i]<=iLast ){. 
2f940 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2f950 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2f960 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
2f970 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2f980 0a                                               .