/ Hex Artifact Content
Login

Artifact ad6e7a9c34a4bab9d10cc857d647ae7ce370a633b5c0bfa71f1c29b81ae364b8:


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 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
57b0: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
57c0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
57d0: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
57e0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
57f0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
5800: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
5810: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5820: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
5830: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5840: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
5850: 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29  EList, pnHeight)
5860: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5870: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
5880: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
5890: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
58a0: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
58b0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
58c0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
58d0: 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67  ->pPrior, pnHeig
58e0: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
58f0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
5900: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
5910: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
5920: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
5930: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
5940: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
5950: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
5960: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
5970: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
5980: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
5990: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
59a0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
59b0: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
59c0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
59d0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
59e0: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
59f0: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
5a00: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
5a10: 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61  agate EP_Propaga
5a20: 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d  te flags up from
5a30: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f   Expr.x.pList to
5a40: 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20   Expr.flags,.** 
5a50: 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
5a60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5a70: 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70  xprSetHeight(Exp
5a80: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  r *p){.  int nHe
5a90: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5aa0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66  htOfExpr(p->pLef
5ab0: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5ac0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5ad0: 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74  pRight, &nHeight
5ae0: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
5af0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5b00: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
5b10: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5b20: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e  p->x.pSelect, &n
5b30: 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  Height);.  }else
5b40: 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20   if( p->x.pList 
5b50: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
5b60: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
5b70: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
5b80: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5b90: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5ba0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5bb0: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5bc0: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
5bd0: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
5be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5bf0: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
5c00: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
5c10: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
5c20: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
5c30: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
5c40: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
5c50: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
5c60: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
5c70: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
5c80: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
5c90: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
5ca0: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5cb0: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5cc0: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5cd0: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
5ce0: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
5cf0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
5d00: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
5d10: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5d20: 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p){.  if( pParse
5d30: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
5d40: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
5d50: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
5d60: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
5d70: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
5d80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
5d90: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
5da0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
5db0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5dc0: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
5dd0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5de0: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
5df0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
5e00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
5e10: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
5e20: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
5e30: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
5e40: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
5e50: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
5e60: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
5e70: 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67   /* ABOVE:  Heig
5e80: 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65  ht enforcement e
5e90: 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20  nabled.  BELOW: 
5ea0: 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65  Height enforceme
5eb0: 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20  nt off */./*.** 
5ec0: 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  Propagate all EP
5ed0: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5ee0: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5ef0: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5f00: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5f10: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5f20: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5f30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5f40: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5f50: 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  p && p->x.pList 
5f60: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
5f70: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
5f80: 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66  ect) ){.    p->f
5f90: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
5fa0: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
5fb0: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5fc0: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  .pList);.  }.}.#
5fd0: 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65  define exprSetHe
5fe0: 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f  ight(y).#endif /
5ff0: 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  * SQLITE_MAX_EXP
6000: 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a  R_DEPTH>0 */../*
6010: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6020: 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c   is the core all
6030: 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20  ocator for Expr 
6040: 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e  nodes..**.** Con
6050: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
6060: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
6070: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
6080: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
6090: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
60a0: 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54  e and for the pT
60b0: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  oken argument is
60c0: 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   a single alloca
60d0: 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  tion.** obtained
60e0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
60f0: 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61  alloc().  The ca
6100: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
6110: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
6120: 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
6130: 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75   the node eventu
6140: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
6150: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  .**.** If dequot
6160: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
6170: 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74  the token (if it
6180: 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75   exists) is dequ
6190: 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75  oted..** If dequ
61a0: 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f  ote is false, no
61b0: 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65   dequoting is pe
61c0: 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64 65  rformed.  The de
61d0: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
61e0: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
61f0: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
6200: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
6210: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
6220: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
6230: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
6240: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
6250: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
6260: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
6270: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
6280: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
6290: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
62a0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
62b0: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
62c0: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
62d0: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
62e0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
62f0: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
6300: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
6310: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
6320: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
6330: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
6340: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
6350: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
6360: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
6370: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
6380: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
6390: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
63a0: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
63b0: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
63c0: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
63d0: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
63e0: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
63f0: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
6400: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
6410: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
6420: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
6430: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
6440: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6450: 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  awNN() */.  int 
6460: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6470: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6480: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6490: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
64a0: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
64b0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
64c0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
64d0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
64e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
64f0: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
6500: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
6510: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
6520: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
6530: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
6540: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
6550: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
6560: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
6570: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
6580: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
6590: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
65a0: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
65b0: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
65c0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
65d0: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
65e0: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
65f0: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
6600: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
6610: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
6620: 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  )+nExtra);.  if(
6630: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
6640: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
6650: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6660: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
6670: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
6680: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
6690: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
66a0: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
66b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
66c0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
66d0: 6c 75 65 7c 45 50 5f 4c 65 61 66 3b 0a 20 20 20  lue|EP_Leaf;.   
66e0: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61       pNew->u.iVa
66f0: 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20  lue = iValue;.  
6700: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6710: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
6720: 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  n = (char*)&pNew
6730: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  [1];.        ass
6740: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d  ert( pToken->z!=
6750: 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d  0 || pToken->n==
6760: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
6770: 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d   pToken->n ) mem
6780: 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  cpy(pNew->u.zTok
6790: 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  en, pToken->z, p
67a0: 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20  Token->n);.     
67b0: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
67c0: 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30  n[pToken->n] = 0
67d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
67e0: 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33  quote && sqlite3
67f0: 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e  Isquote(pNew->u.
6800: 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20  zToken[0]) ){.  
6810: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
6820: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
6830: 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73  "' ) pNew->flags
6840: 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64   |= EP_DblQuoted
6850: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
6860: 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77 2d  te3Dequote(pNew-
6870: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
6880: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6890: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
68a0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
68b0: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
68c0: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
68d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
68e0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
68f0: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
6900: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
6910: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
6920: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
6930: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
6940: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
6950: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
6960: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
6970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
6980: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
6990: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
69a0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
69b0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
69c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
69d0: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
69e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
69f0: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
6a00: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
6a10: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6a20: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
6a30: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
6a40: 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   x.n = sqlite3St
6a50: 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 3b 0a  rlen30(zToken);.
6a60: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
6a70: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70  ExprAlloc(db, op
6a80: 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  , &x, 0);.}../*.
6a90: 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74 72 65  ** Attach subtre
6aa0: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
6ab0: 67 68 74 20 74 6f 20 74 68 65 20 45 78 70 72 20  ght to the Expr 
6ac0: 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a  node pRoot..**.*
6ad0: 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c  * If pRoot==NULL
6ae0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
6af0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
6b00: 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  tion error has o
6b10: 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74  ccurred..** In t
6b20: 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65  hat case, delete
6b30: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 70 4c   the subtrees pL
6b40: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
6b50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
6b60: 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65  xprAttachSubtree
6b70: 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
6b80: 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c  ,.  Expr *pRoot,
6b90: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a  .  Expr *pLeft,.
6ba0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29    Expr *pRight.)
6bb0: 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30  {.  if( pRoot==0
6bc0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6bd0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6be0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   );.    sqlite3E
6bf0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  xprDelete(db, pL
6c00: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
6c10: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6c20: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
6c30: 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  {.    if( pRight
6c40: 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d   ){.      pRoot-
6c50: 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74  >pRight = pRight
6c60: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66  ;.      pRoot->f
6c70: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
6c80: 67 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66  gate & pRight->f
6c90: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lags;.    }.    
6ca0: 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20  if( pLeft ){.   
6cb0: 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20     pRoot->pLeft 
6cc0: 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70  = pLeft;.      p
6cd0: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
6ce0: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c  P_Propagate & pL
6cf0: 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  eft->flags;.    
6d00: 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65 69  }.    exprSetHei
6d10: 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a  ght(pRoot);.  }.
6d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
6d30: 65 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77  e an Expr node w
6d40: 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61  hich joins as ma
6d50: 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72 65  ny as two subtre
6d60: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72  es..**.** One or
6d70: 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62   both of the sub
6d80: 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c  trees can be NUL
6d90: 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  L.  Return a poi
6da0: 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a  nter to the new.
6db0: 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f  ** Expr node.  O
6dc0: 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72  r, if an OOM err
6dd0: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70  or occurs, set p
6de0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
6df0: 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65  cFailed,.** free
6e00: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61 6e   the subtrees an
6e10: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
6e20: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50  /.Expr *sqlite3P
6e30: 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70  Expr(.  Parse *p
6e40: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
6e50: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
6e60: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  xt */.  int op, 
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
6e90: 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  code */.  Expr *
6ea0: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
6eb0: 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e    /* Left operan
6ec0: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  d */.  Expr *pRi
6ed0: 67 68 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  ght            /
6ee0: 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20  * Right operand 
6ef0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b  */.){.  Expr *p;
6f00: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e  .  if( op==TK_AN
6f10: 44 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  D && pParse->nEr
6f20: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  r==0 ){.    /* T
6f30: 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
6f40: 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66   short-circuit f
6f50: 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  alse optimizatio
6f60: 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20  n for AND */.   
6f70: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
6f80: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
6f90: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
6fa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
6fb0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6fc0: 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62  RawNN(pParse->db
6fd0: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
6fe0: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
6ff0: 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
7000: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
7010: 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f 70        p->op = op
7020: 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a 20   & TKFLG_MASK;. 
7030: 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d       p->iAgg = -
7040: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
7050: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
7060: 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64  btrees(pParse->d
7070: 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  b, p, pLeft, pRi
7080: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ght);.  }.  if( 
7090: 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  p ) {.    sqlite
70a0: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
70b0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
70c0: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ght);.  }.  retu
70d0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn p;.}../*.** A
70e0: 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68  dd pSelect to th
70f0: 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  e Expr.x.pSelect
7100: 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20   field.  Or, if 
7110: 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64  pExpr is NULL (d
7120: 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72  ue.** do a memor
7130: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
7140: 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74  lure) then delet
7150: 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62  e the pSelect ob
7160: 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ject..*/.void sq
7170: 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c  lite3PExprAddSel
7180: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
7190: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
71a0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
71b0: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b  {.  if( pExpr ){
71c0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53  .    pExpr->x.pS
71d0: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
71e0: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
71f0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
7200: 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71  IsSelect|EP_Subq
7210: 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
7220: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
7230: 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20  ndFlags(pParse, 
7240: 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  pExpr);.  }else{
7250: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
7260: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
7270: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
7280: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
7290: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
72a0: 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  lect);.  }.}.../
72b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
72c0: 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  ession is always
72d0: 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72 20   either TRUE or 
72e0: 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69 76  FALSE (respectiv
72f0: 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  ely),.** then re
7300: 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20  turn 1.  If one 
7310: 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
7320: 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75 65   the truth value
7330: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
7340: 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65  ssion at compile
7350: 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a  -time return 0..
7360: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
7370: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
7380: 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75  If is OK to retu
7390: 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20 69  rn 0 here even i
73a0: 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  f.** the express
73b0: 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c  ion really is al
73c0: 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61  ways false or fa
73d0: 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67  lse (a false neg
73e0: 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69  ative)..** But i
73f0: 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72 65  t is a bug to re
7400: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
7410: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68  pression might h
7420: 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
7430: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20   boolean values 
7440: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69 72  in different cir
7450: 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61  cumstances (a fa
7460: 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a  lse positive.).*
7470: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
7480: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
7490: 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64   is part of cond
74a0: 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a  itional for a.**
74b0: 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
74c0: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
74d0: 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d  mine at compile-
74e0: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
74f0: 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75  not.** is it tru
7500: 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61  e or false, so a
7510: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a  lways return 0..
7520: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
7530: 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78 70  prAlwaysTrue(Exp
7540: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d  r *p){.  int v =
7550: 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
7560: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
7570: 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
7580: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
7590: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
75a0: 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72  r(p, &v) ) retur
75b0: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21  n 0;.  return v!
75c0: 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  =0;.}.static int
75d0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
75e0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
75f0: 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78   v = 0;.  if( Ex
7600: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7610: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
7620: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
7630: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e  !sqlite3ExprIsIn
7640: 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72  teger(p, &v) ) r
7650: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
7660: 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n v==0;.}../*.**
7670: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
7680: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
7690: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
76a0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
76b0: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
76c0: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
76d0: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
76e0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f  sion..**.** If o
76f0: 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f  ne side or the o
7700: 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20  ther of the AND 
7710: 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66  is known to be f
7720: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65  alse, then inste
7730: 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69  ad.** of returni
7740: 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73  ng an AND expres
7750: 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72  sion, just retur
7760: 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  n a constant exp
7770: 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20  ression with.** 
7780: 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65  a value of false
7790: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
77a0: 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65  e3ExprAnd(sqlite
77b0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65  3 *db, Expr *pLe
77c0: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
77d0: 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d  ){.  if( pLeft==
77e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
77f0: 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20  pRight;.  }else 
7800: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b  if( pRight==0 ){
7810: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66  .    return pLef
7820: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  t;.  }else if( e
7830: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
7840: 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77  Left) || exprAlw
7850: 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29  aysFalse(pRight)
7860: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7870: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  xprDelete(db, pL
7880: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
7890: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
78a0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
78b0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
78c0: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45  lloc(db, TK_INTE
78d0: 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74  GER, &sqlite3Int
78e0: 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20  Tokens[0], 0);. 
78f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
7900: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
7910: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
7920: 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _AND, 0, 0);.   
7930: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
7940: 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70  chSubtrees(db, p
7950: 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  New, pLeft, pRig
7960: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
7970: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
7980: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
7990: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
79a0: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
79b0: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
79c0: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
79d0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
79e0: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
79f0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
7a00: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
7a10: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
7a20: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
7a30: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7a40: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
7a50: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
7a60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
7a70: 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49  oc(db, TK_FUNCTI
7a80: 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  ON, pToken, 1);.
7a90: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
7aa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7ab0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
7ac0: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
7ad0: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
7ae0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
7af0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7b00: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
7b10: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45 78  st = pList;.  Ex
7b20: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
7b30: 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29 3b  ew, EP_HasFunc);
7b40: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
7b50: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
7b60: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
7b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
7b80: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
7b90: 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  s(pParse, pNew);
7ba0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
7bc0: 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  a variable numbe
7bd0: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
7be0: 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20  on that encodes 
7bf0: 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e  a wildcard.** in
7c00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
7c10: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a  L statement.  .*
7c20: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63  *.** Wildcards c
7c30: 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
7c40: 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73  ingle "?" are as
7c50: 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20  signed the next 
7c60: 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61  sequential.** va
7c70: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a  riable number..*
7c80: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
7c90: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
7ca0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
7cb0: 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e  he number "nnn".
7cc0: 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72    We make.** sur
7cd0: 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74  e "nnn" is not t
7ce0: 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69 64 20  oo big to avoid 
7cf0: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
7d00: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
7d10: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
7d20: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
7d30: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
7d40: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
7d50: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
7d60: 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20  ":aaa", "@aaa", 
7d70: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
7d80: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
7d90: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
7da0: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
7db0: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
7dc0: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
7dd0: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
7de0: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
7df0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
7e00: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
7e10: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
7e20: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
7e30: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7e40: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
7e50: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
7e60: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
7e70: 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c 69  , u32 n){.  sqli
7e80: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7e90: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
7ea0: 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20 78  ar *z;.  ynVar x
7eb0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
7ec0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
7ed0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
7ee0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
7ef0: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64  _IntValue|EP_Red
7f00: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
7f10: 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70  y) );.  z = pExp
7f20: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61  r->u.zToken;.  a
7f30: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
7f40: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30   assert( z[0]!=0
7f50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
7f60: 3d 28 75 33 32 29 73 71 6c 69 74 65 33 53 74 72  =(u32)sqlite3Str
7f70: 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69 66  len30(z) );.  if
7f80: 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20  ( z[1]==0 ){.   
7f90: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
7fa0: 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41  the form "?".  A
7fb0: 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76  ssign the next v
7fc0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
7fd0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b  /.    assert( z[
7fe0: 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 78  0]=='?' );.    x
7ff0: 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61   = (ynVar)(++pPa
8000: 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65  rse->nVar);.  }e
8010: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f 41  lse{.    int doA
8020: 64 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  dd = 0;.    if( 
8030: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  z[0]=='?' ){.   
8040: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
8050: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
8060: 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e  ".  Convert "nnn
8070: 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  " to an integer 
8080: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  and.      ** use
8090: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
80a0: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
80b0: 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20      i64 i;.     
80c0: 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20 20   int bOk;.      
80d0: 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f 50  if( n==2 ){ /*OP
80e0: 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54 52  TIMIZATION-IF-TR
80f0: 55 45 2a 2f 0a 20 20 20 20 20 20 20 20 69 20 3d  UE*/.        i =
8100: 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20 54   z[1]-'0';  /* T
8110: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
8120: 66 20 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67 6c  f ?N for a singl
8130: 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20 20  e digit N */.   
8140: 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20       bOk = 1;.  
8150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8160: 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69     bOk = 0==sqli
8170: 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c  te3Atoi64(&z[1],
8180: 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45   &i, n-1, SQLITE
8190: 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a  _UTF8);.      }.
81a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
81b0: 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  i==0 );.      te
81c0: 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a  stcase( i==1 );.
81d0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
81e0: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
81f0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
8200: 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b  BLE_NUMBER]-1 );
8210: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8220: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
8230: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8240: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a  ABLE_NUMBER] );.
8250: 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30        if( bOk==0
8260: 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d   || i<1 || i>db-
8270: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
8280: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
8290: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20  MBER] ){.       
82a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
82b0: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
82c0: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
82d0: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
82e0: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
82f0: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51     db->aLimit[SQ
8300: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
8310: 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20  BLE_NUMBER]);.  
8320: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8330: 20 20 20 20 7d 0a 20 20 20 20 20 20 78 20 3d 20      }.      x = 
8340: 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20  (ynVar)i;.      
8350: 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e 56  if( x>pParse->nV
8360: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ar ){.        pP
8370: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e  arse->nVar = (in
8380: 74 29 78 3b 0a 20 20 20 20 20 20 20 20 64 6f 41  t)x;.        doA
8390: 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  dd = 1;.      }e
83a0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 56  lse if( sqlite3V
83b0: 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50  ListNumToName(pP
83c0: 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78 29  arse->pVList, x)
83d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==0 ){.        d
83e0: 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  oAdd = 1;.      
83f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
8400: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20     /* Wildcards 
8410: 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61  like ":aaa", "$a
8420: 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20  aa" or "@aaa".  
8430: 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  Reuse the same v
8440: 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  ariable.      **
8450: 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 70   number as the p
8460: 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20  rior appearance 
8470: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
8480: 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65  , or if the name
8490: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65  .      ** has ne
84a0: 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66  ver appeared bef
84b0: 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73  ore, reuse the s
84c0: 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ame variable num
84d0: 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ber.      */.   
84e0: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 73 71     x = (ynVar)sq
84f0: 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d 65 54 6f  lite3VListNameTo
8500: 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c 69  Num(pParse->pVLi
8510: 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  st, z, n);.     
8520: 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20   if( x==0 ){.   
8530: 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29       x = (ynVar)
8540: 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29  (++pParse->nVar)
8550: 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64 20  ;.        doAdd 
8560: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
8570: 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 41 64 64   }.    if( doAdd
8580: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
8590: 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pVList = sqlit
85a0: 65 33 56 4c 69 73 74 41 64 64 28 64 62 2c 20 70  e3VListAdd(db, p
85b0: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a  Parse->pVList, z
85c0: 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a 20  , n, x);.    }. 
85d0: 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c   }.  pExpr->iCol
85e0: 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20 78  umn = x;.  if( x
85f0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
8600: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
8610: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
8620: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8630: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
8640: 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  ny SQL variables
8650: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
8660: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
8670: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
8680: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  n tree..*/.stati
8690: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
86a0: 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  E void sqlite3Ex
86b0: 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74  prDeleteNN(sqlit
86c0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
86d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
86e0: 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20   );.  /* Sanity 
86f0: 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68  check: Assert th
8700: 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20  at the IntValue 
8710: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  is non-negative 
8720: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
8730: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
8740: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8750: 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d  _IntValue) || p-
8760: 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  >u.iValue>=0 );.
8770: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8780: 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48 61  BUG.  if( ExprHa
8790: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
87a0: 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48 61  Leaf) && !ExprHa
87b0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
87c0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
87d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 65    assert( p->pLe
87e0: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ft==0 );.    ass
87f0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
8800: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8810: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30   p->x.pSelect==0
8820: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
8830: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
8840: 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f 6b  perty(p, (EP_Tok
8850: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29  enOnly|EP_Leaf))
8860: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45   ){.    /* The E
8870: 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e  xpr.x union is n
8880: 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65  ever used at the
8890: 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78   same time as Ex
88a0: 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20  pr.pRight */.   
88b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c   assert( p->x.pL
88c0: 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ist==0 || p->pRi
88d0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
88e0: 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70 2d  ( p->pLeft && p-
88f0: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op!=TK_SELECT_C
8900: 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33 45  OLUMN ) sqlite3E
8910: 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  xprDeleteNN(db, 
8920: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  p->pLeft);.    i
8930: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a  f( p->pRight ){.
8940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8950: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 2d  rDeleteNN(db, p-
8960: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 65  >pRight);.    }e
8970: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
8980: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
8990: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
89a0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
89b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
89c0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
89d0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
89e0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
89f0: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  db, p->x.pList);
8a00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8a10: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8a20: 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  (p, EP_MemToken)
8a30: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
8a40: 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  (db, p->u.zToken
8a50: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
8a60: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8a70: 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73  Static) ){.    s
8a80: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
8a90: 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  b, p);.  }.}.voi
8aa0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
8ab0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
8ac0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
8ad0: 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70 72   p ) sqlite3Expr
8ae0: 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b  DeleteNN(db, p);
8af0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
8b00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
8b10: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
8b20: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
8b30: 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  n structure .** 
8b40: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
8b50: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
8b60: 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  is is always one
8b70: 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   of EXPR_FULLSIZ
8b80: 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43  E,.** EXPR_REDUC
8b90: 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54  EDSIZE or EXPR_T
8ba0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f  OKENONLYSIZE..*/
8bb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
8bc0: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
8bd0: 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48  *p){.  if( ExprH
8be0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8bf0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65  _TokenOnly) ) re
8c00: 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  turn EXPR_TOKENO
8c10: 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45  NLYSIZE;.  if( E
8c20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8c30: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20  , EP_Reduced) ) 
8c40: 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55  return EXPR_REDU
8c50: 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72  CEDSIZE;.  retur
8c60: 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  n EXPR_FULLSIZE;
8c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75  .}../*.** The du
8c80: 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72  pedExpr*Size() r
8c90: 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74  outines each ret
8ca0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8cb0: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
8cc0: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63  .** to store a c
8cd0: 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73  opy of an expres
8ce0: 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69  sion or expressi
8cf0: 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64  on tree.  They d
8d00: 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20  iffer in.** how 
8d10: 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65  much of the tree
8d20: 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a   is measured..**
8d30: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
8d40: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20  rStructSize()   
8d50: 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74    Size of only t
8d60: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
8d70: 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  e .**     dupedE
8d80: 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20  xprNodeSize()   
8d90: 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72      Size of Expr
8da0: 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b   + space for tok
8db0: 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  en.**     dupedE
8dc0: 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20  xprSize()       
8dd0: 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e      Expr + token
8de0: 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f   + subtree compo
8df0: 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  nents.**.*******
8e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e40: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
8e50: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
8e60: 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  ze() function re
8e70: 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73  turns two values
8e80: 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a   OR-ed together:
8e90: 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70    .** (1) the sp
8ea0: 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
8eb0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
8ec0: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e  xpr structure on
8ed0: 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74  ly and .** (2) t
8ee0: 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20  he EP_xxx flags 
8ef0: 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68  that indicate wh
8f00: 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65  at the structure
8f10: 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e   size should be.
8f20: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
8f30: 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20  alues is always 
8f40: 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
8f50: 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45     EXPR_FULLSIZE
8f60: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45  .**      EXPR_RE
8f70: 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50  DUCEDSIZE   | EP
8f80: 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20  _Reduced.**     
8f90: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
8fa0: 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  IZE | EP_TokenOn
8fb0: 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ly.**.** The siz
8fc0: 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  e of the structu
8fd0: 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  re can be found 
8fe0: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72  by masking the r
8ff0: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f  eturn value.** o
9000: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  f this routine w
9010: 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20  ith 0xfff.  The 
9020: 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75  flags can be fou
9030: 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68  nd by masking th
9040: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
9050: 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65  e with EP_Reduce
9060: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a  d|EP_TokenOnly..
9070: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
9080: 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52  with flags==EXPR
9090: 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73  DUP_REDUCE, this
90a0: 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20   routines works 
90b0: 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20  on full-size.** 
90c0: 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72  (unreduced) Expr
90d0: 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79   objects as they
90e0: 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63   or originally c
90f0: 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68  onstructed by th
9100: 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72  e parser..** Dur
9110: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ing expression a
9120: 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69  nalysis, extra i
9130: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f  nformation is co
9140: 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64  mputed and moved
9150: 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70   into.** later p
9160: 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72  arts of teh Expr
9170: 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74   object and that
9180: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
9190: 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f  on might get cho
91a0: 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74  pped.** off if t
91b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
91c0: 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20   reduced.  Note 
91d0: 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65  also that it doe
91e0: 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a  s not work to.**
91f0: 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50   make an EXPRDUP
9200: 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20  _REDUCE copy of 
9210: 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65 73  a reduced expres
9220: 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c  sion.  It is onl
9230: 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65  y legal.** to re
9240: 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65 20  duce a pristine 
9250: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
9260: 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e  from the parser.
9270: 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61    The implementa
9280: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64  tion.** of duped
9290: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29  ExprStructSize()
92a0: 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c   contain multipl
92b0: 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  e assert() state
92c0: 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d  ments that attem
92d0: 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65  pt.** to enforce
92e0: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
92f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9300: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
9310: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
9320: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
9330: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
9340: 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  flags==EXPRDUP_R
9350: 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d  EDUCE || flags==
9360: 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65  0 ); /* Only one
9370: 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f   flag value allo
9380: 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  wed */.  assert(
9390: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d   EXPR_FULLSIZE<=
93a0: 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72  0xfff );.  asser
93b0: 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50 5f  t( (0xfff & (EP_
93c0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
93d0: 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69  Only))==0 );.  i
93e0: 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20 70  f( 0==flags || p
93f0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
9400: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6e 53  COLUMN ){.    nS
9410: 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53  ize = EXPR_FULLS
9420: 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IZE;.  }else{.  
9430: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
9440: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9450: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
9460: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73  duced) );.    as
9470: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
9480: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
9490: 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61  mJoin) ); .    a
94a0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
94b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65  roperty(p, EP_Me
94c0: 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61  mToken) );.    a
94d0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
94e0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f  roperty(p, EP_No
94f0: 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69  Reduce) );.    i
9500: 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70  f( p->pLeft || p
9510: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
9520: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
9530: 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50  REDUCEDSIZE | EP
9540: 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65  _Reduced;.    }e
9550: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
9560: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
9570: 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  );.      nSize =
9580: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
9590: 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  IZE | EP_TokenOn
95a0: 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ly;.    }.  }.  
95b0: 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a  return nSize;.}.
95c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
95d0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
95e0: 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
95f0: 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
9600: 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f  e the copy .** o
9610: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
9620: 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20  ture and a copy 
9630: 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54  of the Expr.u.zT
9640: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
9650: 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69  that.** string i
9660: 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73  s defined.).*/.s
9670: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
9680: 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72  xprNodeSize(Expr
9690: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
96a0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64  .  int nByte = d
96b0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
96c0: 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30  ze(p, flags) & 0
96d0: 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70  xfff;.  if( !Exp
96e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
96f0: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
9700: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
9710: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
9720: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
9730: 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a  .zToken)+1;.  }.
9740: 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
9750: 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nByte);.}../*.**
9760: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
9770: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
9780: 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  ired to create a
9790: 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68   duplicate of th
97a0: 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  e .** expression
97b0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
97c0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
97d0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
97e0: 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20  nt is a.** mask 
97f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44  containing EXPRD
9800: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
9810: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
9820: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
9830: 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20  space to create 
9840: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
9850: 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73  pr struct.** its
9860: 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66 66  elf and the buff
9870: 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20 62  er referred to b
9880: 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c  y Expr.u.zToken,
9890: 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49   if any..**.** I
98a0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
98b0: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
98c0: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
98d0: 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73  n value includes
98e0: 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75   .** space to du
98f0: 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72  plicate all Expr
9900: 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72   nodes in the tr
9910: 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70  ee formed by Exp
9920: 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20  r.pLeft .** and 
9930: 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72 69  Expr.pRight vari
9940: 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66  ables (but not f
9950: 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72 65  or any structure
9960: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20  s pointed to or 
9970: 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72  .** descended fr
9980: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
9990: 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53  ist or Expr.x.pS
99a0: 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73 29  elect variables)
99b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
99c0: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45 78  dupedExprSize(Ex
99d0: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
99e0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
99f0: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
9a00: 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64     nByte = duped
9a10: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20  ExprNodeSize(p, 
9a20: 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
9a30: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
9a40: 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42  DUCE ){.      nB
9a50: 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72  yte += dupedExpr
9a60: 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66  Size(p->pLeft, f
9a70: 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78 70  lags) + dupedExp
9a80: 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c  rSize(p->pRight,
9a90: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20   flags);.    }. 
9aa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74   }.  return nByt
9ab0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
9ac0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
9ad0: 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45  ilar to sqlite3E
9ae0: 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70 74  xprDup(), except
9af0: 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66 65   that if pzBuffe
9b00: 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c  r .** is not NUL
9b10: 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72  L then *pzBuffer
9b20: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70   is assumed to p
9b30: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
9b40: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a   large enough .*
9b50: 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  * to store the c
9b60: 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f  opy of expressio
9b70: 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20  n p, the copies 
9b80: 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a  of p->u.zToken.*
9b90: 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65  * (if applicable
9ba0: 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65  ), and the copie
9bb0: 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66  s of the p->pLef
9bc0: 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20  t and p->pRight 
9bd0: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
9be0: 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72  if any. Before r
9bf0: 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66  eturning, *pzBuf
9c00: 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74 68  fer is set to th
9c10: 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
9c20: 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  t the.** portion
9c30: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
9c40: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
9c50: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
9c60: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
9c70: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
9c80: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 64  , Expr *p, int d
9c90: 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a  upFlags, u8 **pz
9ca0: 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20  Buffer){.  Expr 
9cb0: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
9cc0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
9cd0: 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c  urn */.  u8 *zAl
9ce0: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f  loc;           /
9cf0: 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 66  * Memory space f
9d00: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62 75 69  rom which to bui
9d10: 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 2a  ld Expr object *
9d20: 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63 46 6c  /.  u32 staticFl
9d30: 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45 50 5f  ag;       /* EP_
9d40: 53 74 61 74 69 63 20 69 66 20 73 70 61 63 65 20  Static if space 
9d50: 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  not obtained fro
9d60: 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61  m malloc */..  a
9d70: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
9d80: 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20    assert( p );. 
9d90: 20 61 73 73 65 72 74 28 20 64 75 70 46 6c 61 67   assert( dupFlag
9da0: 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73  s==0 || dupFlags
9db0: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
9dc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a   );.  assert( pz
9dd0: 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70  Buffer==0 || dup
9de0: 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  Flags==EXPRDUP_R
9df0: 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46  EDUCE );..  /* F
9e00: 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20  igure out where 
9e10: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65 77  to write the new
9e20: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 2e   Expr structure.
9e30: 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75 66 66   */.  if( pzBuff
9e40: 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63  er ){.    zAlloc
9e50: 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20   = *pzBuffer;.  
9e60: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
9e70: 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73  P_Static;.  }els
9e80: 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20  e{.    zAlloc = 
9e90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
9ea0: 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64 45 78  awNN(db, dupedEx
9eb0: 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  prSize(p, dupFla
9ec0: 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74 69 63  gs));.    static
9ed0: 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Flag = 0;.  }.  
9ee0: 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a  pNew = (Expr *)z
9ef0: 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e  Alloc;..  if( pN
9f00: 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74  ew ){.    /* Set
9f10: 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65   nNewSize to the
9f20: 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20   size allocated 
9f30: 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72  for the structur
9f40: 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20  e pointed to.   
9f50: 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69   ** by pNew. Thi
9f60: 73 20 69 73 20 65 69 74 68 65 72 20 45 58 50 52  s is either EXPR
9f70: 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f  _FULLSIZE, EXPR_
9f80: 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20  REDUCEDSIZE or. 
9f90: 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e     ** EXPR_TOKEN
9fa0: 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e  ONLYSIZE. nToken
9fb0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
9fc0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63  umber of bytes c
9fd0: 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62  onsumed.    ** b
9fe0: 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  y the copy of th
9ff0: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
a000: 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20  ring (if any).. 
a010: 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20     */.    const 
a020: 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74  unsigned nStruct
a030: 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72  Size = dupedExpr
a040: 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 64 75  StructSize(p, du
a050: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e  pFlags);.    con
a060: 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20  st int nNewSize 
a070: 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20  = nStructSize & 
a080: 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e  0xfff;.    int n
a090: 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 21  Token;.    if( !
a0a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a0b0: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
a0c0: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
a0d0: 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d  {.      nToken =
a0e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
a0f0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20  (p->u.zToken) + 
a100: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
a110: 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a      nToken = 0;.
a120: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 75      }.    if( du
a130: 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  pFlags ){.      
a140: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
a150: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
a160: 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20  duced)==0 );.   
a170: 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63     memcpy(zAlloc
a180: 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a  , p, nNewSize);.
a190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a1a0: 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28 75 33   u32 nSize = (u3
a1b0: 32 29 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  2)exprStructSize
a1c0: 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  (p);.      memcp
a1d0: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69  y(zAlloc, p, nSi
a1e0: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ze);.      if( n
a1f0: 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49  Size<EXPR_FULLSI
a200: 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20 6d  ZE ){ .        m
a210: 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53  emset(&zAlloc[nS
a220: 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55  ize], 0, EXPR_FU
a230: 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20  LLSIZE-nSize);. 
a240: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a250: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f    /* Set the EP_
a260: 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65  Reduced, EP_Toke
a270: 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74  nOnly, and EP_St
a280: 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f  atic flags appro
a290: 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20  priately. */.   
a2a0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20   pNew->flags &= 
a2b0: 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  ~(EP_Reduced|EP_
a2c0: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61  TokenOnly|EP_Sta
a2d0: 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  tic|EP_MemToken)
a2e0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  ;.    pNew->flag
a2f0: 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  s |= nStructSize
a300: 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45   & (EP_Reduced|E
a310: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20  P_TokenOnly);.  
a320: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
a330: 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20   staticFlag;..  
a340: 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d    /* Copy the p-
a350: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
a360: 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
a370: 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20   if( nToken ){. 
a380: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65       char *zToke
a390: 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  n = pNew->u.zTok
a3a0: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c  en = (char*)&zAl
a3b0: 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20  loc[nNewSize];. 
a3c0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b       memcpy(zTok
a3d0: 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  en, p->u.zToken,
a3e0: 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a   nToken);.    }.
a3f0: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d  .    if( 0==((p-
a400: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
a410: 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e 4f  gs) & (EP_TokenO
a420: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b  nly|EP_Leaf)) ){
a430: 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  .      /* Fill i
a440: 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53  n the pNew->x.pS
a450: 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78  elect or pNew->x
a460: 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a  .pList member. *
a470: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
a480: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
a490: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
a4a0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
a4b0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
a4c0: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
a4d0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75 70  ->x.pSelect, dup
a4e0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 65  Flags);.      }e
a4f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
a500: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c  w->x.pList = sql
a510: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
a520: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20  db, p->x.pList, 
a530: 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  dupFlags);.     
a540: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a550: 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70   Fill in pNew->p
a560: 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70  Left and pNew->p
a570: 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66  Right. */.    if
a580: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a590: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
a5a0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
a5b0: 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63   ){.      zAlloc
a5c0: 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64   += dupedExprNod
a5d0: 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67  eSize(p, dupFlag
a5e0: 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45  s);.      if( !E
a5f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a600: 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  New, EP_TokenOnl
a610: 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20  y|EP_Leaf) ){.  
a620: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
a630: 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a 20  t = p->pLeft ?. 
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c       exprDup(db,
a660: 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44   p->pLeft, EXPRD
a670: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
a680: 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  oc) : 0;.       
a690: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
a6a0: 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20 20 20  p->pRight ?.    
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20 70     exprDup(db, p
a6d0: 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55  ->pRight, EXPRDU
a6e0: 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f  P_REDUCE, &zAllo
a6f0: 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 0a  c) : 0;.      }.
a700: 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66        if( pzBuff
a710: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  er ){.        *p
a720: 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63  zBuffer = zAlloc
a730: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
a740: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
a750: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a760: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
a770: 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  EP_Leaf) ){.    
a780: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70      if( pNew->op
a790: 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  ==TK_SELECT_COLU
a7a0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
a7b0: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
a7c0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  >pLeft;.        
a7d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f    assert( p->iCo
a7e0: 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  lumn==0 || p->pR
a7f0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
a800: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a810: 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d  pRight==0  || p-
a820: 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66  >pRight==p->pLef
a830: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t );.        }el
a840: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
a850: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
a860: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
a870: 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
a880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
a890: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  New->pRight = sq
a8a0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a8b0: 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a   p->pRight, 0);.
a8c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a8d0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
a8e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
a8f0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65   and return a de
a900: 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f  ep copy of the o
a910: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
a920: 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61  the second .** a
a930: 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f  rgument. If an O
a940: 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  OM condition is 
a950: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c  encountered, NUL
a960: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  L is returned.**
a970: 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c   and the db->mal
a980: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73  locFailed flag s
a990: 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  et..*/.#ifndef S
a9a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73  QLITE_OMIT_CTE.s
a9b0: 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74 68  tatic With *with
a9c0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
a9d0: 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74   With *p){.  Wit
a9e0: 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  h *pRet = 0;.  i
a9f0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
aa00: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
aa10: 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61  p) + sizeof(p->a
aa20: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d  [0]) * (p->nCte-
aa30: 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73  1);.    pRet = s
aa40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
aa50: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
aa60: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
aa70: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
aa80: 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70    pRet->nCte = p
aa90: 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f  ->nCte;.      fo
aaa0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
aab0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
aac0: 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pRet->a[i].pSele
aad0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
aae0: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  ctDup(db, p->a[i
aaf0: 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ].pSelect, 0);. 
ab00: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
ab10: 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65  ].pCols = sqlite
ab20: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
ab30: 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20   p->a[i].pCols, 
ab40: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  0);.        pRet
ab50: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
ab60: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ab70: 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  b, p->a[i].zName
ab80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ab90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
aba0: 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  et;.}.#else.# de
abb0: 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79  fine withDup(x,y
abc0: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
abd0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
abe0: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
abf0: 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69  s make deep copi
ac00: 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  es of expression
ac10: 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  s,.** expression
ac20: 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73   lists, ID lists
ac30: 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61  , and select sta
ac40: 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f  tements.  The co
ac50: 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64  pies can.** be d
ac60: 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67  eleted (by being
ac70: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72   passed to their
ac80: 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44   respective ...D
ac90: 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73  elete() routines
aca0: 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66  ).** without eff
acb0: 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  ecting the origi
acc0: 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nals..**.** The 
acd0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
ace0: 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20   ID, and source 
acf0: 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20  lists return by 
ad00: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
ad10: 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  up(),.** sqlite3
ad20: 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64  IdListDup(), and
ad30: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
ad40: 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20  up() can not be 
ad50: 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64  further expanded
ad60: 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65   .** by subseque
ad70: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
ad80: 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20  te*ListAppend() 
ad90: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20  routines..**.** 
ada0: 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20  Any tables that 
adb0: 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68  the SrcList migh
adc0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e  t point to are n
add0: 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a  ot duplicated..*
ade0: 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
adf0: 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e  arameter contain
ae00: 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  s a combination 
ae10: 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 58  of the EXPRDUP_X
ae20: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20  XX flags..** If 
ae30: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
ae40: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
ae50: 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75  then the structu
ae60: 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  re returned is a
ae70: 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65  .** truncated ve
ae80: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75  rsion of the usu
ae90: 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75 72  al Expr structur
aea0: 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73  e that will be s
aeb0: 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74  tored as.** part
aec0: 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
aed0: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
aee0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
aef0: 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72   schema..*/.Expr
af00: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70   *sqlite3ExprDup
af10: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
af20: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
af30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  ){.  assert( fla
af40: 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
af50: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
af60: 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20 65  ;.  return p ? e
af70: 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c  xprDup(db, p, fl
af80: 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a 45  ags, 0) : 0;.}.E
af90: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
afa0: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
afb0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
afc0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
afd0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
afe0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
aff0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
b000: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
b010: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70  int i;.  Expr *p
b020: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d  PriorSelectCol =
b030: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   0;.  assert( db
b040: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
b050: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b060: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
b070: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
b080: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
b090: 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20 20 69  ize(db, p));.  i
b0a0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
b0b0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
b0c0: 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72 3b  Expr = p->nExpr;
b0d0: 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e 65 77 2d  .  pItem = pNew-
b0e0: 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d  >a;.  pOldItem =
b0f0: 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30   p->a;.  for(i=0
b100: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
b110: 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64  +, pItem++, pOld
b120: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
b130: 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f  r *pOldExpr = pO
b140: 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  ldItem->pExpr;. 
b150: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
b160: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  r;.    pItem->pE
b170: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
b180: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70  rDup(db, pOldExp
b190: 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  r, flags);.    i
b1a0: 66 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20 20  f( pOldExpr .   
b1b0: 20 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e 6f    && pOldExpr->o
b1c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
b1d0: 55 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e 65  UMN.     && (pNe
b1e0: 77 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  wExpr = pItem->p
b1f0: 45 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29 7b  Expr)!=0 .    ){
b200: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b210: 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  NewExpr->iColumn
b220: 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20 20  ==0 || i>0 );.  
b230: 20 20 20 20 69 66 28 20 70 4e 65 77 45 78 70 72      if( pNewExpr
b240: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ->iColumn==0 ){.
b250: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b260: 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74 3d  pOldExpr->pLeft=
b270: 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67 68  =pOldExpr->pRigh
b280: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72  t );.        pPr
b290: 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20 70  iorSelectCol = p
b2a0: 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  NewExpr->pLeft =
b2b0: 20 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67 68   pNewExpr->pRigh
b2c0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
b2d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b2e0: 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  i>0 );.        a
b2f0: 73 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31 5d  ssert( pItem[-1]
b300: 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  .pExpr!=0 );.   
b310: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
b320: 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  wExpr->iColumn==
b330: 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d  pItem[-1].pExpr-
b340: 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20  >iColumn+1 );.  
b350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
b360: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d 70  riorSelectCol==p
b370: 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e  Item[-1].pExpr->
b380: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20  pLeft );.       
b390: 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74   pNewExpr->pLeft
b3a0: 20 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43   = pPriorSelectC
b3b0: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
b3c0: 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  }.    pItem->zNa
b3d0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
b3e0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b3f0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
b400: 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71  Item->zSpan = sq
b410: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b420: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61  , pOldItem->zSpa
b430: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73  n);.    pItem->s
b440: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49  ortOrder = pOldI
b450: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
b460: 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20      pItem->done 
b470: 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  = 0;.    pItem->
b480: 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c  bSpanIsTab = pOl
b490: 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  dItem->bSpanIsTa
b4a0: 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20  b;.    pItem->u 
b4b0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20  = pOldItem->u;. 
b4c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
b4d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75  ;.}../*.** If cu
b4e0: 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c  rsors, triggers,
b4f0: 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75   views and subqu
b500: 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d  eries are all om
b510: 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  itted from.** th
b520: 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f  e build, then no
b530: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
b540: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78  ing routines, ex
b550: 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c  cept for .** sql
b560: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c  ite3SelectDup(),
b570: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
b580: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
b590: 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a  () is sometimes.
b5a0: 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  ** called with a
b5b0: 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a   NULL argument..
b5c0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
b5d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
b5e0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
b5f0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
b600: 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65  R) \. || !define
b610: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
b620: 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20  BQUERY).SrcList 
b630: 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  *sqlite3SrcListD
b640: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
b650: 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  SrcList *p, int 
b660: 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73  flags){.  SrcLis
b670: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
b680: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
b690: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
b6a0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
b6b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
b6c0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
b6d0: 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a  (p->nSrc>0 ? siz
b6e0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
b6f0: 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b  p->nSrc-1) : 0);
b700: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
b710: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
b720: 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
b730: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
b740: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  rn 0;.  pNew->nS
b750: 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  rc = pNew->nAllo
b760: 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66  c = p->nSrc;.  f
b770: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72  or(i=0; i<p->nSr
b780: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
b790: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
b7a0: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
b7b0: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
b7c0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
b7d0: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
b7e0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c  ->a[i];.    Tabl
b7f0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65  e *pTab;.    pNe
b800: 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d  wItem->pSchema =
b810: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65   pOldItem->pSche
b820: 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ma;.    pNewItem
b830: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
b840: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b850: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  , pOldItem->zDat
b860: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
b870: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
b880: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b890: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
b8a0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
b8b0: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
b8c0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
b8d0: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
b8e0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b8f0: 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66  fg = pOldItem->f
b900: 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  g;.    pNewItem-
b910: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
b920: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
b930: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72    pNewItem->addr
b940: 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74  FillSub = pOldIt
b950: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b  em->addrFillSub;
b960: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72  .    pNewItem->r
b970: 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49  egReturn = pOldI
b980: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
b990: 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d      if( pNewItem
b9a0: 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
b9b0: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74   ){.      pNewIt
b9c0: 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
b9d0: 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  y = sqlite3DbStr
b9e0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b9f0: 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29  ->u1.zIndexedBy)
ba00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
ba10: 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d  Item->pIBIndex =
ba20: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e   pOldItem->pIBIn
ba30: 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  dex;.    if( pNe
ba40: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  wItem->fg.isTabF
ba50: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  unc ){.      pNe
ba60: 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  wItem->u1.pFuncA
ba70: 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  rg = .          
ba80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
ba90: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
baa0: 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c  >u1.pFuncArg, fl
bab0: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
bac0: 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d  pTab = pNewItem-
bad0: 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  >pTab = pOldItem
bae0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
baf0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54  pTab ){.      pT
bb00: 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
bb10: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65     }.    pNewIte
bb20: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
bb30: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
bb40: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c  , pOldItem->pSel
bb50: 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ect, flags);.   
bb60: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d   pNewItem->pOn =
bb70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
bb80: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f  db, pOldItem->pO
bb90: 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  n, flags);.    p
bba0: 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20  NewItem->pUsing 
bbb0: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
bbc0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
bbd0: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
bbe0: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
bbf0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
bc00: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
bc10: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
bc20: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
bc30: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
bc40: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
bc50: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
bc60: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64  t i;.  assert( d
bc70: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
bc80: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
bc90: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
bca0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
bcb0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
bcc0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
bcd0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
bce0: 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64  ew->nId = p->nId
bcf0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
bd00: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
bd10: 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69  NN(db, p->nId*si
bd20: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
bd30: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
bd40: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
bd50: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65  DbFreeNN(db, pNe
bd60: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
bd70: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
bd80: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
bd90: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
bda0: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
bdb0: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
bdc0: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
bdd0: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
bde0: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
bdf0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
be00: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
be10: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
be20: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
be30: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
be40: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
be50: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
be60: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
be70: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
be80: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
be90: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
bea0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
beb0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
bec0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
bed0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bee0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
bef0: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
bf00: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
bf10: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
bf20: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
bf30: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
bf40: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
bf50: 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  pDup, int flags)
bf60: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65 74  {.  Select *pRet
bf70: 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a   = 0;.  Select *
bf80: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c  pNext = 0;.  Sel
bf90: 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65 74  ect **pp = &pRet
bfa0: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a  ;.  Select *p;..
bfb0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
bfc0: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70 3b  );.  for(p=pDup;
bfd0: 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29   p; p=p->pPrior)
bfe0: 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e  {.    Select *pN
bff0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
c000: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c010: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20  zeof(*p) );.    
c020: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62 72  if( pNew==0 ) br
c030: 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  eak;.    pNew->p
c040: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
c050: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
c060: 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29  ->pEList, flags)
c070: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63  ;.    pNew->pSrc
c080: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
c090: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
c0a0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c0b0: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
c0c0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
c0d0: 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73  p->pWhere, flags
c0e0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72  );.    pNew->pGr
c0f0: 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
c100: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
c110: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67  ->pGroupBy, flag
c120: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48  s);.    pNew->pH
c130: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
c140: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
c150: 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20  aving, flags);. 
c160: 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42     pNew->pOrderB
c170: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
c180: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
c190: 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a  rderBy, flags);.
c1a0: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70      pNew->op = p
c1b0: 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ->op;.    pNew->
c1c0: 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pNext = pNext;. 
c1d0: 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
c1e0: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  = 0;.    pNew->p
c1f0: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
c200: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
c210: 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  imit, flags);.  
c220: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
c230: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f   0;.    pNew->iO
c240: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
c250: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
c260: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53  p->selFlags & ~S
c270: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
c280: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  .    pNew->addrO
c290: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
c2a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  .    pNew->addrO
c2b0: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b  penEphm[1] = -1;
c2c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65  .    pNew->nSele
c2d0: 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65  ctRow = p->nSele
c2e0: 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d  ctRow;.    pNew-
c2f0: 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70  >pWith = withDup
c300: 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a  (db, p->pWith);.
c310: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c320: 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70  tSetName(pNew, p
c330: 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20  ->zSelName);.   
c340: 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20   *pp = pNew;.   
c350: 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50 72   pp = &pNew->pPr
c360: 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d  ior;.    pNext =
c370: 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65   pNew;.  }..  re
c380: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
c390: 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  se.Select *sqlit
c3a0: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
c3b0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
c3c0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
c3d0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
c3e0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
c3f0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
c400: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
c410: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
c420: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
c430: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
c440: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
c450: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
c460: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
c470: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
c480: 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20 6d  pList argument m
c490: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 55  ust be either NU
c4a0: 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  LL or a pointer 
c4b0: 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a 2a  to an ExprList.*
c4c0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
c4d0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
c4e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
c4f0: 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20 72  ppend().  This r
c500: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e 6f  outine.** may no
c510: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
c520: 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61 69  n ExprList obtai
c530: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
c540: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a  ExprListDup()..*
c550: 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73 20  * Reason:  This 
c560: 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20  routine assumes 
c570: 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
c580: 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69 73  of slots in pLis
c590: 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20 70  t->a[].** is a p
c5a0: 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54 68  ower of two.  Th
c5b0: 61 74 20 69 73 20 74 72 75 65 20 66 6f 72 20 73  at is true for s
c5c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
c5d0: 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a 2a  pend() returns.*
c5e0: 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65 63  * but is not nec
c5f0: 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 66 72  essarily true fr
c600: 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  om the return va
c610: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45 78  lue of sqlite3Ex
c620: 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a 0a  prListDup()..**.
c630: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
c640: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
c650: 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69  occurs, the enti
c660: 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64  re list is freed
c670: 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20   and.** NULL is 
c680: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f  returned.  If no
c690: 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  n-NULL is return
c6a0: 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  ed, then it is g
c6b0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61  uaranteed.** tha
c6c0: 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  t the new entry 
c6d0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
c6e0: 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78   appended..*/.Ex
c6f0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
c700: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
c710: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c720: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
c730: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c740: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
c750: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
c760: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
c770: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
c780: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
c790: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
c7a0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
c7b0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
c7c0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
c7d0: 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
c7e0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
c7f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c800: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
c810: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
c820: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
c830: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
c840: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c850: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  NN(db, sizeof(Ex
c860: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
c870: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
c880: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
c890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
c8a0: 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20  t->nExpr = 0;.  
c8b0: 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74  }else if( (pList
c8c0: 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74  ->nExpr & (pList
c8d0: 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29  ->nExpr-1))==0 )
c8e0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
c8f0: 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d  pNew;.    pNew =
c900: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
c910: 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20 20  c(db, pList, .  
c920: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
c930: 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c 69  f(*pList)+(2*pLi
c940: 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a 73  st->nExpr - 1)*s
c950: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
c960: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ]));.    if( pNe
c970: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  w==0 ){.      go
c980: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
c990: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
c9a0: 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  w;.  }.  pItem =
c9b0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
c9c0: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61 73  ->nExpr++];.  as
c9d0: 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73  sert( offsetof(s
c9e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c9f0: 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65  tem,zName)==size
ca00: 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  of(pItem->pExpr)
ca10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
ca20: 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78  fsetof(struct Ex
ca30: 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78 70  prList_item,pExp
ca40: 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  r)==0 );.  memse
ca50: 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  t(&pItem->zName,
ca60: 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  0,sizeof(*pItem)
ca70: 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74  -offsetof(struct
ca80: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a   ExprList_item,z
ca90: 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d 2d  Name));.  pItem-
caa0: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
cab0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
cac0: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
cad0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
cae0: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
caf0: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
cb00: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
cb10: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
cb20: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
cb30: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
cb40: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  st);.  return 0;
cb50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d  .}../*.** pColum
cb60: 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72  ns and pExpr for
cb70: 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69 67  m a vector assig
cb80: 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 70  nment which is p
cb90: 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a  art of the SET.*
cba0: 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55  * clause of an U
cbb0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
cbc0: 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
cbd0: 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63  **        (a,b,c
cbe0: 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32  ) = (expr1,expr2
cbf0: 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20  ,expr3).** Or:  
cc00: 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c    (a,b,c) = (SEL
cc10: 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e  ECT x,y,z FROM .
cc20: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ...).**.** For e
cc30: 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ach term of the 
cc40: 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e  vector assignmen
cc50: 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e  t, append new en
cc60: 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  tries to the.** 
cc70: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
cc80: 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63  pList.  In the c
cc90: 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65 72  ase of a subquer
cca0: 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70  y on the RHS, ap
ccb0: 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43  pend.** TK_SELEC
ccc0: 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73  T_COLUMN express
ccd0: 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  ions..*/.ExprLis
cce0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
ccf0: 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a  stAppendVector(.
cd00: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
cd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
cd20: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
cd30: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
cd40: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
cd50: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
cd60: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
cd70: 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  L */.  IdList *p
cd80: 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a  Columns,      /*
cd90: 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f   List of names o
cda0: 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73  f LHS of the ass
cdb0: 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  ignment */.  Exp
cdc0: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
cdd0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78      /* Vector ex
cde0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
cdf0: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
ce00: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
ce10: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
ce20: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
ce30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
ce40: 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20   iFirst = pList 
ce50: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
ce60: 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e   0;.  /* pColumn
ce70: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55  s can only be NU
ce80: 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d  LL due to an OOM
ce90: 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c   but an OOM will
cea0: 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65   cause an.  ** e
ceb0: 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69  xit prior to thi
cec0: 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20  s routine being 
ced0: 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28  invoked */.  if(
cee0: 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d   NEVER(pColumns=
cef0: 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f  =0) ) goto vecto
cf00: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a  r_append_error;.
cf10: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
cf20: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
cf30: 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a  end_error;..  /*
cf40: 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61   If the RHS is a
cf50: 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65   vector, then we
cf60: 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79   can immediately
cf70: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
cf80: 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a  at .  ** the siz
cf90: 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64  e of the RHS and
cfa0: 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74   LHS match.  But
cfb0: 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 61   if the RHS is a
cfc0: 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77   SELECT, .  ** w
cfd0: 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20 69  ildcards ("*") i
cfe0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
cff0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d   of the SELECT m
d000: 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
d010: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63  before.  ** we c
d020: 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63  an do the size c
d030: 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74  heck, so defer t
d040: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e  he size check un
d050: 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
d060: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
d070: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45  pExpr->op!=TK_SE
d080: 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73  LECT && pColumns
d090: 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65  ->nId!=(n=sqlite
d0a0: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
d0b0: 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73  pExpr)) ){.    s
d0c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d0d0: 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d  Parse, "%d colum
d0e0: 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76  ns assigned %d v
d0f0: 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20  alues",.        
d100: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
d110: 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20  umns->nId, n);. 
d120: 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61     goto vector_a
d130: 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d  ppend_error;.  }
d140: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
d150: 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b  Columns->nId; i+
d160: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53  +){.    Expr *pS
d170: 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ubExpr = sqlite3
d180: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
d190: 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ld(pParse, pExpr
d1a0: 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  , i);.    pList 
d1b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
d1c0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
d1d0: 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72 29  pList, pSubExpr)
d1e0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
d1f0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d200: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69   pList->nExpr==i
d210: 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20  First+i+1 );.   
d220: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73     pList->a[pLis
d230: 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  t->nExpr-1].zNam
d240: 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b  e = pColumns->a[
d250: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
d260: 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a  pColumns->a[i].z
d270: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Name = 0;.    }.
d280: 20 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e    }..  if( !db->
d290: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
d2a0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
d2b0: 4c 45 43 54 20 26 26 20 41 4c 57 41 59 53 28 70  LECT && ALWAYS(p
d2c0: 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
d2d0: 45 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20 70  Expr *pFirst = p
d2e0: 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e  List->a[iFirst].
d2f0: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
d300: 74 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b 0a  t( pFirst!=0 );.
d310: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72      assert( pFir
d320: 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  st->op==TK_SELEC
d330: 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  T_COLUMN );.    
d340: 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74   .    /* Store t
d350: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
d360: 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f  ent in pRight so
d370: 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65   it will be dele
d380: 74 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  ted when.    ** 
d390: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
d3a0: 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65  elete() is calle
d3b0: 64 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d  d */.    pFirst-
d3c0: 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b  >pRight = pExpr;
d3d0: 0a 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a  .    pExpr = 0;.
d3e0: 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72  .    /* Remember
d3f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d400: 20 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20 73   LHS in iTable s
d410: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 68  o that we can ch
d420: 65 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  eck that.    ** 
d430: 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20  the RHS and LHS 
d440: 73 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72 69  sizes match duri
d450: 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ng code generati
d460: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72 73  on. */.    pFirs
d470: 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c  t->iTable = pCol
d480: 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a  umns->nId;.  }..
d490: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
d4a0: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ror:.  sqlite3Ex
d4b0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
d4c0: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  pr);.  sqlite3Id
d4d0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
d4e0: 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75  Columns);.  retu
d4f0: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
d500: 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74 20  ** Set the sort 
d510: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61  order for the la
d520: 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68  st element on th
d530: 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74  e given ExprList
d540: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d550: 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74  3ExprListSetSort
d560: 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a  Order(ExprList *
d570: 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65  p, int iSortOrde
d580: 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  r){.  if( p==0 )
d590: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
d5a0: 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44  t( SQLITE_SO_UND
d5b0: 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49  EFINED<0 && SQLI
d5c0: 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20  TE_SO_ASC>=0 && 
d5d0: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30  SQLITE_SO_DESC>0
d5e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
d5f0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66  >nExpr>0 );.  if
d600: 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29  ( iSortOrder<0 )
d610: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
d620: 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73  >a[p->nExpr-1].s
d630: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
d640: 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72  _SO_ASC );.    r
d650: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e  eturn;.  }.  p->
d660: 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f  a[p->nExpr-1].so
d670: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53  rtOrder = (u8)iS
d680: 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a  ortOrder;.}../*.
d690: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c  ** Set the ExprL
d6a0: 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c  ist.a[].zName el
d6b0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73  ement of the mos
d6c0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
d6d0: 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20   item.** on the 
d6e0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
d6f0: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67  .**.** pList mig
d700: 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f  ht be NULL follo
d710: 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  wing an OOM erro
d720: 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68  r.  But pName sh
d730: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a  ould never be.**
d740: 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d   NULL.  If a mem
d750: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
d760: 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65  ails, the pParse
d770: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
d780: 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65  ed flag.** is se
d790: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d7a0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
d7b0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
d7c0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
d7d0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d7e0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d7f0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
d800: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
d810: 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a   add the span. *
d820: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
d830: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
d840: 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20  ame to be added 
d850: 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65  */.  int dequote
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d870: 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68  True to cause th
d880: 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71  e name to be deq
d890: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  uoted */.){.  as
d8a0: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
d8b0: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
d8c0: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
d8d0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
d8e0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
d8f0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
d900: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
d910: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
d920: 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73     pItem = &pLis
d930: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
d940: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
d950: 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
d960: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  0 );.    pItem->
d970: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
d980: 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d  bStrNDup(pParse-
d990: 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  >db, pName->z, p
d9a0: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66  Name->n);.    if
d9b0: 28 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69  ( dequote ) sqli
d9c0: 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d  te3Dequote(pItem
d9d0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a  ->zName);.  }.}.
d9e0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
d9f0: 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61  xprList.a[].zSpa
da00: 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  n element of the
da10: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
da20: 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20  dded item.** on 
da30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
da40: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ist..**.** pList
da50: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66   might be NULL f
da60: 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20  ollowing an OOM 
da70: 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61  error.  But pSpa
da80: 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  n should never b
da90: 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61  e.** NULL.  If a
daa0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
dab0: 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50  on fails, the pP
dac0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
dad0: 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69  Failed flag.** i
dae0: 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s set..*/.void s
daf0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
db00: 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a  tSpan(.  Parse *
db10: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
db20: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
db30: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
db40: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
db50: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
db60: 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61  h to add the spa
db70: 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  n. */.  const ch
db80: 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20  ar *zStart,     
db90: 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65 20  /* Start of the 
dba0: 73 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  span */.  const 
dbb0: 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20  char *zEnd      
dbc0: 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
dbd0: 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  span */.){.  sql
dbe0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
dbf0: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
dc00: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d   pList!=0 || db-
dc10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
dc20: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
dc30: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
dc40: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
dc50: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
dc60: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
dc70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
dc80: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
dc90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
dca0: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
dcb0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
dcc0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
dcd0: 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61 72  panDup(db, zStar
dce0: 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a 7d 0a  t, zEnd);.  }.}.
dcf0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
dd00: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45  pression list pE
dd10: 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  List contains mo
dd20: 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65  re than iLimit e
dd30: 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76  lements,.** leav
dd40: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
dd50: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
dd60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
dd70: 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68  rListCheckLength
dd80: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
dd90: 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  e,.  ExprList *p
dda0: 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63  EList,.  const c
ddb0: 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a  har *zObject.){.
ddc0: 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73    int mx = pPars
ddd0: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
dde0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
ddf0: 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  N];.  testcase( 
de00: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
de10: 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20  ->nExpr==mx );. 
de20: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
de30: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
de40: 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66  pr==mx+1 );.  if
de50: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
de60: 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a  st->nExpr>mx ){.
de70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
de80: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
de90: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
dea0: 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a   %s", zObject);.
deb0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
dec0: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78  ete an entire ex
ded0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
dee0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
def0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78  NOINLINE void ex
df00: 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73  prListDeleteNN(s
df10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
df20: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
df30: 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e  int i = pList->n
df40: 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20 45  Expr;.  struct E
df50: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
df60: 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61 3b  tem =  pList->a;
df70: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
df80: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 64  ->nExpr>0 );.  d
df90: 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  o{.    sqlite3Ex
dfa0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  prDelete(db, pIt
dfb0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
dfc0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
dfd0: 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
dfe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
dff0: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53  ee(db, pItem->zS
e000: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2b  pan);.    pItem+
e010: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 69  +;.  }while( --i
e020: 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  >0 );.  sqlite3D
e030: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73  bFreeNN(db, pLis
e040: 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  t);.}.void sqlit
e050: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
e060: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
e070: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
e080: 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 65 78    if( pList ) ex
e090: 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64  prListDeleteNN(d
e0a0: 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
e0b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62  .** Return the b
e0c0: 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c  itwise-OR of all
e0d0: 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c   Expr.flags fiel
e0e0: 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a  ds in the given.
e0f0: 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a  ** ExprList..*/.
e100: 75 33 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c  u32 sqlite3ExprL
e110: 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45  istFlags(const E
e120: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
e130: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20  .  int i;.  u32 
e140: 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  m = 0;.  assert(
e150: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 66   pList!=0 );.  f
e160: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
e170: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
e180: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
e190: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
e1a0: 70 72 3b 0a 20 20 20 20 20 61 73 73 65 72 74 28  pr;.     assert(
e1b0: 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20   pExpr!=0 );.   
e1c0: 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c    m |= pExpr->fl
e1d0: 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ags;.  }.  retur
e1e0: 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n m;.}../*.** Th
e1f0: 69 73 20 69 73 20 61 20 53 45 4c 45 43 54 2d 6e  is is a SELECT-n
e200: 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ode callback for
e210: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e220: 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20 61  walker that.** a
e230: 6c 77 61 79 73 20 22 66 61 69 6c 73 22 2e 20 20  lways "fails".  
e240: 42 79 20 22 66 61 69 6c 22 20 69 6e 20 74 68 69  By "fail" in thi
e250: 73 20 63 61 73 65 2c 20 77 65 20 6d 65 61 6e 20  s case, we mean 
e260: 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e  set.** pWalker->
e270: 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61 6e  eCode to zero an
e280: 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 54  d abort..**.** T
e290: 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  his callback is 
e2a0: 75 73 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65  used by multiple
e2b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b   expression walk
e2c0: 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ers..*/.int sqli
e2d0: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
e2e0: 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  l(Walker *pWalke
e2f0: 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73  r, Select *NotUs
e300: 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
e310: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
e320: 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  ;.  pWalker->eCo
e330: 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  de = 0;.  return
e340: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a 2f   WRC_Abort;.}../
e350: 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
e360: 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63  nes are Walker c
e370: 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f  allbacks used to
e380: 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f   check expressio
e390: 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20  ns to.** see if 
e3a0: 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61  they are "consta
e3b0: 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66  nt" for some def
e3c0: 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74  inition of const
e3d0: 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c  ant.  The.** Wal
e3e0: 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20  ker.eCode value 
e3f0: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74  determines the t
e400: 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74  ype of "constant
e410: 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  " we are looking
e420: 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  .** for..**.** T
e430: 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f  hese callback ro
e440: 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
e450: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
e460: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
e470: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
e480: 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  rIsConstant()   
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
e4a0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31  Walker->eCode==1
e4b0: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
e4c0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
e4d0: 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20 20  Join()          
e4e0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
e4f0: 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =2.**     sqlite
e500: 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
e510: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
e520: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
e530: 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==3.**     sqli
e540: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
e550: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20  tOrFunction()   
e560: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
e570: 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a  ode==4 or 5.**.*
e580: 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20  * In all cases, 
e590: 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65  the callbacks se
e5a0: 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30  t Walker.eCode=0
e5b0: 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68   and abort if th
e5c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
e5d0: 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20  is found to not 
e5e0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  be a constant..*
e5f0: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
e600: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
e610: 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73  Function() is us
e620: 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  ed for evaluatin
e630: 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  g expressions.**
e640: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
e650: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
e660: 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  he Walker.eCode 
e670: 76 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20  value is 5 when 
e680: 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78  parsing.** an ex
e690: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e  isting schema an
e6a0: 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73  d 4 when process
e6b0: 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d  ing a new statem
e6c0: 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a  ent.  A bound.**
e6d0: 20 70 61 72 61 6d 65 74 65 72 20 72 61 69 73 65   parameter raise
e6e0: 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e  s an error for n
e6f0: 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62  ew statements, b
e700: 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63  ut is silently c
e710: 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e  onverted.** to N
e720: 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ULL for existing
e730: 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20   schemas.  This 
e740: 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61  allows sqlite_ma
e750: 73 74 65 72 20 74 61 62 6c 65 73 20 74 68 61 74  ster tables that
e760: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62   .** contain a b
e770: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62  ound parameter b
e780: 65 63 61 75 73 65 20 74 68 65 79 20 77 65 72 65  ecause they were
e790: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c   generated by ol
e7a0: 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  der versions.** 
e7b0: 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20  of SQLite to be 
e7c0: 70 61 72 73 65 64 20 62 79 20 6e 65 77 65 72 20  parsed by newer 
e7d0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
e7e0: 74 65 20 77 69 74 68 6f 75 74 20 72 61 69 73 69  te without raisi
e7f0: 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65  ng a.** malforme
e800: 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a  d schema error..
e810: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
e820: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
e830: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
e840: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
e850: 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72  .  /* If pWalker
e860: 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68 65  ->eCode is 2 the
e870: 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68  n any term of th
e880: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
e890: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a  t comes from.  *
e8a0: 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
e8b0: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c  G clauses of a l
e8c0: 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  eft join disqual
e8d0: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
e8e0: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
e8f0: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
e900: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
e910: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
e920: 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73 50  e==2 && ExprHasP
e930: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
e940: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
e950: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
e960: 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  e = 0;.    retur
e970: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
e980: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
e990: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
e9a0: 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f  Consider functio
e9b0: 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e  ns to be constan
e9c0: 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61  t if all their a
e9d0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e  rguments are con
e9e0: 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64  stant.    ** and
e9f0: 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d   either pWalker-
ea00: 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f  >eCode==4 or 5 o
ea10: 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68  r the function h
ea20: 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51  as the.    ** SQ
ea30: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20  LITE_FUNC_CONST 
ea40: 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73  flag. */.    cas
ea50: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
ea60: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
ea70: 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78  ->eCode>=4 || Ex
ea80: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
ea90: 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63  xpr,EP_ConstFunc
eaa0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
eab0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
eac0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ead0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
eae0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
eaf0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
eb00: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
eb10: 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20   case TK_ID:.   
eb20: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
eb30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
eb40: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
eb50: 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
eb60: 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  N:.      testcas
eb70: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
eb80: 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _ID );.      tes
eb90: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
eba0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
ebb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
ebc0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
ebd0: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
ebe0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
ebf0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
ec00: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69  OLUMN );.      i
ec10: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
ec20: 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69  e==3 && pExpr->i
ec30: 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
ec40: 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  u.iCur ){.      
ec50: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
ec60: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
ec70: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
ec80: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
ec90: 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a   TK_IF_NULL_ROW:
eca0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ecb0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
ecc0: 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20  F_NULL_ROW );.  
ecd0: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
ece0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  de = 0;.      re
ecf0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
ed00: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
ed10: 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  ABLE:.      if( 
ed20: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
ed30: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 ){.        /* 
ed40: 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  Silently convert
ed50: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
ed60: 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
ed70: 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20  side of CREATE. 
ed80: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d         ** statem
ed90: 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c  ents into a NULL
eda0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68   when parsing th
edb0: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
edc0: 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20  nt text out.    
edd0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71      ** of the sq
ede0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
edf0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78  e */.        pEx
ee00: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
ee10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ee20: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
ee30: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
ee40: 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
ee50: 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
ee60: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
ee70: 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
ee80: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
ee90: 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
eea0: 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
eeb0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
eec0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
eed0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
eee0: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
eef0: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
ef00: 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c  gh */.    defaul
ef10: 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t:.      testcas
ef20: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
ef30: 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71  _SELECT ); /* sq
ef40: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
ef50: 61 69 6c 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ail will disallo
ef60: 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  w */.      testc
ef70: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
ef80: 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20  TK_EXISTS ); /* 
ef90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
efa0: 6b 46 61 69 6c 20 77 69 6c 6c 20 64 69 73 61 6c  kFail will disal
efb0: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  low */.      ret
efc0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
efd0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69  ;.  }.}.static i
efe0: 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45  nt exprIsConst(E
eff0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74  xpr *p, int init
f000: 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29 7b  Flag, int iCur){
f010: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
f020: 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61  .eCode = initFla
f030: 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  g;.  w.xExprCall
f040: 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49  back = exprNodeI
f050: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78  sConstant;.  w.x
f060: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
f070: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
f080: 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20 53  lkFail;.#ifdef S
f090: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77 2e  QLITE_DEBUG.  w.
f0a0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
f0b0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
f0c0: 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e  WalkAssert2;.#en
f0d0: 64 69 66 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d  dif.  w.u.iCur =
f0e0: 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33   iCur;.  sqlite3
f0f0: 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
f100: 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
f110: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
f120: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
f130: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
f140: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
f150: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
f160: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
f170: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
f180: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
f190: 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
f1a0: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
f1b0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
f1c0: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
f1d0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
f1e0: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
f1f0: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
f200: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
f210: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
f220: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
f230: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
f240: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
f250: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
f260: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
f270: 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a  Const(p, 1, 0);.
f280: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
f290: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
f2a0: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
f2b0: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
f2c0: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
f2d0: 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  .** that does no
f2e0: 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20   originate from 
f2f0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
f300: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69  clauses of a joi
f310: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  n..** Return 0 i
f320: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
f330: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
f340: 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72  ion calls or ter
f350: 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e  ms from.** an ON
f360: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
f370: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f380: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
f390: 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a  tJoin(Expr *p){.
f3a0: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
f3b0: 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d  onst(p, 2, 0);.}
f3c0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
f3d0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
f3e0: 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
f3f0: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
f400: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
f410: 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c  ** for any singl
f420: 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62  e row of the tab
f430: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
f440: 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Cur.  In other w
f450: 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70  ords, the.** exp
f460: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  ression must not
f470: 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f   refer to any no
f480: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
f490: 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79  function nor any
f4a0: 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20  .** table other 
f4b0: 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e  than iCur..*/.in
f4c0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  t sqlite3ExprIsT
f4d0: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70  ableConstant(Exp
f4e0: 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b  r *p, int iCur){
f4f0: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
f500: 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72  Const(p, 3, iCur
f510: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  );.}.../*.** sql
f520: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63  ite3WalkExpr() c
f530: 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
f540: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
f550: 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 29  stantOrGroupBy()
f560: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f570: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
f580: 6e 74 4f 72 47 72 6f 75 70 42 79 28 57 61 6c 6b  ntOrGroupBy(Walk
f590: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
f5a0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
f5b0: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20  rList *pGroupBy 
f5c0: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 47 72  = pWalker->u.pGr
f5d0: 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20 69 3b 0a  oupBy;.  int i;.
f5e0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70  .  /* Check if p
f5f0: 45 78 70 72 20 69 73 20 69 64 65 6e 74 69 63 61  Expr is identica
f600: 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55 50 20 42  l to any GROUP B
f610: 59 20 74 65 72 6d 2e 20 49 66 20 73 6f 2c 20 63  Y term. If so, c
f620: 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20 69 74 20  onsider.  ** it 
f630: 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a 20 20  constant.  */.  
f640: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
f650: 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
f660: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
f670: 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
f680: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71  Expr;.    if( sq
f690: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
f6a0: 28 30 2c 20 70 45 78 70 72 2c 20 70 2c 20 2d 31  (0, pExpr, p, -1
f6b0: 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  )<2 ){.      Col
f6c0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
f6d0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
f6e0: 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72  eq(pWalker->pPar
f6f0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66  se, p);.      if
f700: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
f710: 70 28 22 42 49 4e 41 52 59 22 2c 20 70 43 6f 6c  p("BINARY", pCol
f720: 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  l->zName)==0 ){.
f730: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
f740: 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
f750: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
f760: 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78 70 72  * Check if pExpr
f770: 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74   is a sub-select
f780: 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65  . If so, conside
f790: 72 20 69 74 20 76 61 72 69 61 62 6c 65 2e 20 2a  r it variable. *
f7a0: 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  /.  if( ExprHasP
f7b0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
f7c0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
f7d0: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
f7e0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  de = 0;.    retu
f7f0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
f800: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  }..  return expr
f810: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 70  NodeIsConstant(p
f820: 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b 0a  Walker, pExpr);.
f830: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68  }../*.** Walk th
f840: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  e expression tre
f850: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
f860: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
f870: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a  Return non-zero.
f880: 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ** if the expres
f890: 73 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e  sion consists en
f8a0: 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61  tirely of consta
f8b0: 6e 74 73 20 6f 72 20 63 6f 70 69 65 73 20 6f 66  nts or copies of
f8c0: 20 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20 70 47   terms .** in pG
f8d0: 72 6f 75 70 42 79 20 74 68 61 74 20 73 6f 72 74  roupBy that sort
f8e0: 20 77 69 74 68 20 74 68 65 20 42 49 4e 41 52 59   with the BINARY
f8f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
f900: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nce..**.** This 
f910: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
f920: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
f930: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41  a term of the HA
f940: 56 49 4e 47 20 63 6c 61 75 73 65 20 63 61 6e 0a  VING clause can.
f950: 2a 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64 20 69  ** be promoted i
f960: 6e 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c  nto the WHERE cl
f970: 61 75 73 65 2e 20 20 49 6e 20 6f 72 64 65 72 20  ause.  In order 
f980: 66 6f 72 20 73 75 63 68 20 61 20 70 72 6f 6d 6f  for such a promo
f990: 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a  tion to work,.**
f9a0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
f9b0: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
f9c0: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 68 65  term must be the
f9d0: 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20 6d 65   same for all me
f9e0: 6d 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20 22 67  mbers of.** a "g
f9f0: 72 6f 75 70 22 2e 20 20 54 68 65 20 72 65 71 75  roup".  The requ
fa00: 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  irement that the
fa10: 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20 6d   GROUP BY term m
fa20: 75 73 74 20 62 65 20 42 49 4e 41 52 59 0a 2a 2a  ust be BINARY.**
fa30: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 6e 6f   assumes that no
fa40: 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67   other collating
fa50: 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 68   sequence will h
fa60: 61 76 65 20 61 20 66 69 6e 65 72 2d 67 72 61 69  ave a finer-grai
fa70: 6e 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 20  ned.** grouping 
fa80: 74 68 61 6e 20 62 69 6e 61 72 79 2e 20 20 49 6e  than binary.  In
fa90: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 28 41 3d   other words (A=
faa0: 42 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79  B COLLATE binary
fab0: 29 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41 3d 42  ) implies.** A=B
fac0: 20 69 6e 20 65 76 65 72 79 20 6f 74 68 65 72 20   in every other 
fad0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fae0: 63 65 2e 20 20 54 68 65 20 72 65 71 75 69 72 65  ce.  The require
faf0: 6d 65 6e 74 20 74 68 61 74 20 74 68 65 0a 2a 2a  ment that the.**
fb00: 20 47 52 4f 55 50 20 42 59 20 62 65 20 42 49 4e   GROUP BY be BIN
fb10: 41 52 59 20 69 73 20 73 74 72 69 63 74 65 72 20  ARY is stricter 
fb20: 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20  than necessary. 
fb30: 20 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f 20 77   It would also w
fb40: 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74  ork.** to promot
fb50: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73  e HAVING clauses
fb60: 20 74 68 61 74 20 75 73 65 20 74 68 65 20 73 61   that use the sa
fb70: 6d 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63  me alternative c
fb80: 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
fb90: 65 6e 63 65 20 61 73 20 74 68 65 20 47 52 4f 55  ence as the GROU
fba0: 50 20 42 59 20 74 65 72 6d 2c 20 62 75 74 20 74  P BY term, but t
fbb0: 68 61 74 20 69 73 20 6d 75 63 68 20 68 61 72 64  hat is much hard
fbc0: 65 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20  er to check,.** 
fbd0: 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c  alternative coll
fbe0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
fbf0: 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e  are uncommon, an
fc00: 64 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 61  d this is only a
fc10: 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n.** optimizatio
fc20: 6e 2c 20 73 6f 20 77 65 20 74 61 6b 65 20 74 68  n, so we take th
fc30: 65 20 65 61 73 79 20 77 61 79 20 6f 75 74 20 61  e easy way out a
fc40: 6e 64 20 73 69 6d 70 6c 79 20 72 65 71 75 69 72  nd simply requir
fc50: 65 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42  e the.** GROUP B
fc60: 59 20 74 6f 20 75 73 65 20 74 68 65 20 42 49 4e  Y to use the BIN
fc70: 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ARY collating se
fc80: 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73  quence..*/.int s
fc90: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
fca0: 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 50 61  tantOrGroupBy(Pa
fcb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
fcc0: 72 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a  r *p, ExprList *
fcd0: 70 47 72 6f 75 70 42 79 29 7b 0a 20 20 57 61 6c  pGroupBy){.  Wal
fce0: 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65  ker w;.  w.eCode
fcf0: 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43   = 1;.  w.xExprC
fd00: 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f  allback = exprNo
fd10: 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  deIsConstantOrGr
fd20: 6f 75 70 42 79 3b 0a 20 20 77 2e 78 53 65 6c 65  oupBy;.  w.xSele
fd30: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ctCallback = 0;.
fd40: 20 20 77 2e 75 2e 70 47 72 6f 75 70 42 79 20 3d    w.u.pGroupBy =
fd50: 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 70   pGroupBy;.  w.p
fd60: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
fd70: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
fd80: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
fd90: 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
fda0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
fdb0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
fdc0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
fdd0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
fde0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
fdf0: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
fe00: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
fe10: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
fe20: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
fe30: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
fe40: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
fe50: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
fe60: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
fe70: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
fe80: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
fe90: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
fea0: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
feb0: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
fec0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
fed0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
fee0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
fef0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
ff00: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
ff10: 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49  (Expr *p, u8 isI
ff20: 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nit){.  assert( 
ff30: 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49  isInit==0 || isI
ff40: 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75  nit==1 );.  retu
ff50: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
ff60: 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a  , 4+isInit, 0);.
ff70: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ff80: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
ff90: 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  INTS./*.** Walk 
ffa0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
ffb0: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
ffc0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ffd0: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75  contains a.** su
ffe0: 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b  bquery of some k
fff0: 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ind.  Return 0 i
10000 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73  f there are no s
10010 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e  ubqueries..*/.in
10020 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e  t sqlite3ExprCon
10030 74 61 69 6e 73 53 75 62 71 75 65 72 79 28 45 78  tainsSubquery(Ex
10040 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72  pr *p){.  Walker
10050 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20   w;.  w.eCode = 
10060 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  1;.  w.xExprCall
10070 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
10080 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
10090 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
100a0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  = sqlite3SelectW
100b0 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20  alkFail;.#ifdef 
100c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77  SQLITE_DEBUG.  w
100d0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
100e0 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  2 = sqlite3Selec
100f0 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65  tWalkAssert2;.#e
10100 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 57 61  ndif.  sqlite3Wa
10110 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
10120 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d   return w.eCode=
10130 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  =0;.}.#endif../*
10140 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
10150 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
10160 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
10170 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
10180 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
10190 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
101a0 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
101b0 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
101c0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
101d0 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
101e0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
101f0 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
10200 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
10210 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
10220 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
10230 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
10240 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
10250 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
10260 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
10270 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
10280 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
10290 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  lue){.  int rc =
102a0 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   0;.  if( p==0 )
102b0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
102c0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66  an only happen f
102d0 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20  ollowing on OOM 
102e0 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  */..  /* If an e
102f0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
10300 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20  integer literal 
10310 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73  that fits in a s
10320 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a  igned 32-bit.  *
10330 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  * integer, then 
10340 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
10350 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61  flag will have a
10360 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20  lready been set 
10370 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
10380 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
10390 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  | (p->flags & EP
103a0 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20  _IntValue)!=0.  
103b0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
103c0 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75  te3GetInt32(p->u
103d0 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30  .zToken, &rc)==0
103e0 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c   );..  if( p->fl
103f0 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
10400 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65  e ){.    *pValue
10410 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a   = p->u.iValue;.
10420 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
10430 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  }.  switch( p->o
10440 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
10450 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
10460 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rc = sqlite3Expr
10470 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
10480 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
10490 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
104a0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
104b0 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
104c0 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
104d0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
104e0 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20  r(p->pLeft, &v) 
104f0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
10500 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36  t( v!=(-21474836
10510 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  47-1) );.       
10520 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20   *pValue = -v;. 
10530 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
10540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
10550 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
10560 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
10570 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10580 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46  ../*.** Return F
10590 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73  ALSE if there is
105a0 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
105b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
105c0 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  an be NULL..**.*
105d0 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
105e0 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ion might be NUL
105f0 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72  L or if the expr
10600 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f  ession is too co
10610 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c  mplex.** to tell
10620 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a   return TRUE.  .
10630 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
10640 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e  ne is used as an
10650 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
10660 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c  o skip OP_IsNull
10670 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e   opcodes.** when
10680 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20   we know that a 
10690 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
106a0 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20  NULL.  Hence, a 
106b0 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a  false positive.*
106c0 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55  * (returning TRU
106d0 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74  E when in fact t
106e0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
106f0 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29  n never be NULL)
10700 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73   might.** be a s
10710 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65  mall performance
10720 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65   hit but is othe
10730 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20  rwise harmless. 
10740 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a   On the other.**
10750 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e   hand, a false n
10760 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69  egative (returni
10770 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68  ng FALSE when th
10780 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62  e result could b
10790 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20  e NULL).** will 
107a0 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
107b0 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e   an incorrect an
107c0 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69  swer.  So when i
107d0 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a  n doubt, return.
107e0 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20  ** TRUE..*/.int 
107f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
10800 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20  Null(const Expr 
10810 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  *p){.  u8 op;.  
10820 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  while( p->op==TK
10830 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d  _UPLUS || p->op=
10840 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20  =TK_UMINUS ){ p 
10850 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20  = p->pLeft; }.  
10860 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66  op = p->op;.  if
10870 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
10880 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
10890 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
108a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
108b0 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54  EGER:.    case T
108c0 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61  K_STRING:.    ca
108d0 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
108e0 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20   case TK_BLOB:. 
108f0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
10900 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
10910 4e 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  N:.      return 
10920 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
10930 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29  p, EP_CanBeNull)
10940 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
10950 20 70 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20 20   p->pTab==0 ||  
10960 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20  /* Reference to 
10970 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
10980 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  on expression */
10990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
109a0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20  ->iColumn>=0 && 
109b0 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d  p->pTab->aCol[p-
109c0 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  >iColumn].notNul
109d0 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75  l==0);.    defau
109e0 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
109f0 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
10a00 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
10a10 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
10a20 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61  sion is a consta
10a30 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  nt which would b
10a40 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62  e.** unchanged b
10a50 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69  y OP_Affinity wi
10a60 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  th the affinity 
10a70 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
10a80 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ond.** argument.
10a90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
10aa0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
10ab0 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
10ac0 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72  OP_Affinity oper
10ad0 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
10ae0 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69  omitted.  When i
10af0 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46  n doubt return F
10b00 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e  ALSE.  A false n
10b10 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61  egative.** is ha
10b20 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65  rmless.  A false
10b30 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76   positive, howev
10b40 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69  er, can result i
10b50 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61  n the wrong.** a
10b60 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nswer..*/.int sq
10b70 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
10b80 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63  AffinityChange(c
10b90 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68  onst Expr *p, ch
10ba0 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70  ar aff){.  u8 op
10bb0 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c  ;.  if( aff==SQL
10bc0 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72  ITE_AFF_BLOB ) r
10bd0 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65  eturn 1;.  while
10be0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
10bf0 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
10c00 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
10c10 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
10c20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
10c30 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
10c40 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
10c50 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
10c60 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
10c70 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
10c80 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
10c90 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
10ca0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
10cb0 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
10cc0 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
10cd0 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
10ce0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
10cf0 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
10d00 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
10d10 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
10d20 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72  TRING: {.      r
10d30 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
10d40 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
10d50 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  }.    case TK_BL
10d60 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  OB: {.      retu
10d70 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
10d80 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
10d90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10da0 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20  p->iTable>=0 ); 
10db0 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20   /* p cannot be 
10dc0 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20  part of a CHECK 
10dd0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
10de0 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
10df0 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20  olumn<0.        
10e00 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
10e10 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
10e20 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
10e30 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d  _NUMERIC);.    }
10e40 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
10e50 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
10e60 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
10e70 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
10e80 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
10e90 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
10ea0 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69  olumn name..*/.i
10eb0 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
10ec0 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  d(const char *z)
10ed0 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  {.  if( sqlite3S
10ee0 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49  trICmp(z, "_ROWI
10ef0 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  D_")==0 ) return
10f00 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
10f10 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57  3StrICmp(z, "ROW
10f20 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
10f30 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
10f40 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44  3StrICmp(z, "OID
10f50 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
10f60 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
10f70 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65  ./*.** pX is the
10f80 20 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70   RHS of an IN op
10f90 65 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69  erator.  If pX i
10fa0 73 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  s a SELECT state
10fb0 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61  ment .** that ca
10fc0 6e 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20  n be simplified 
10fd0 74 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c  to a direct tabl
10fe0 65 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72  e access, then r
10ff0 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
11000 65 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54  er to the SELECT
11010 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20   statement.  If 
11020 70 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45  pX is not a SELE
11030 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  CT statement,.**
11040 20 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43   or if the SELEC
11050 54 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64  T statement need
11060 73 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74  s to be manifest
11070 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69  ed into a transi
11080 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68  ent.** table, th
11090 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  en return NULL..
110a0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
110b0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
110c0 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69  static Select *i
110d0 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
110e0 70 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20  pt(Expr *pX){.  
110f0 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63  Select *p;.  Src
11100 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78  List *pSrc;.  Ex
11110 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
11120 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
11130 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45   int i;.  if( !E
11140 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
11150 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
11160 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
11170 20 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   Not a subquery 
11180 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  */.  if( ExprHas
11190 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
111a0 56 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65  VarSelect)  ) re
111b0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72  turn 0;  /* Corr
111c0 65 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20  elated subq */. 
111d0 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65   p = pX->x.pSele
111e0 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  ct;.  if( p->pPr
111f0 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11210 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  Not a compound S
11220 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
11230 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
11240 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
11250 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74  regate) ){.    t
11260 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
11270 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
11280 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
11290 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
112a0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
112b0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
112c0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
112d0 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
112e0 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
112f0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e    return 0; /* N
11300 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  o DISTINCT keywo
11310 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67  rd and no aggreg
11320 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
11330 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
11340 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11360 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   Has no GROUP BY
11370 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
11380 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
11390 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
113a0 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49      /* Has no LI
113b0 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  MIT clause */.  
113c0 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20  if( p->pWhere ) 
113d0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
113e0 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
113f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
11400 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
11410 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
11420 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53  c!=0 );.  if( pS
11430 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
11440 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
11450 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20   /* Single term 
11460 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
11470 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b  /.  if( pSrc->a[
11480 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74  0].pSelect ) ret
11490 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52  urn 0;     /* FR
114a0 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71  OM is not a subq
114b0 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a  uery or view */.
114c0 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
114d0 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65  [0].pTab;.  asse
114e0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
114f0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
11500 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20  Select==0 );    
11510 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
11520 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
11530 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73  view */.  if( Is
11540 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
11550 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
11560 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
11570 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
11580 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ble */.  pEList 
11590 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61  = p->pEList;.  a
115a0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
115b0 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c   );.  /* All SEL
115c0 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74  ECT results must
115d0 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a   be columns. */.
115e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
115f0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
11600 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73  {.    Expr *pRes
11610 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
11620 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
11630 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  Res->op!=TK_COLU
11640 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
11650 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
11660 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61  >iTable==pSrc->a
11670 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20  [0].iCursor );  
11680 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
11690 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
116a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
116b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
116c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
116d0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
116e0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
116f0 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
11700 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b   code that check
11710 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
11720 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
11730 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65  table iCur to se
11740 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61  e if.** it conta
11750 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74  ins any NULL ent
11760 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65  ries.  Cause the
11770 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67   register at reg
11780 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65  HasNull to be se
11790 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  t.** to a non-NU
117a0 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72  LL value if iCur
117b0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
117c0 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73  Ls.  Cause regis
117d0 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a  ter regHasNull.*
117e0 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e  * to be set to N
117f0 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74  ULL if iCur cont
11800 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
11810 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f   NULL values..*/
11820 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
11830 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
11840 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ag(Vdbe *v, int 
11850 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73  iCur, int regHas
11860 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64  Null){.  int add
11870 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r1;.  sqlite3Vdb
11880 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
11890 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73  teger, 0, regHas
118a0 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d  Null);.  addr1 =
118b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
118c0 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
118d0 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65   iCur); VdbeCove
118e0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
118f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11900 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c  OP_Column, iCur,
11910 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b   0, regHasNull);
11920 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
11930 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
11940 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56  _TYPEOFARG);.  V
11950 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
11960 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25  first_entry_in(%
11970 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73  d)", iCur));.  s
11980 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
11990 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a  re(v, addr1);.}.
119a0 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66  #endif...#ifndef
119b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
119c0 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20  QUERY./*.** The 
119d0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49  argument is an I
119e0 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
119f0 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
11a00 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a  bquery) on the .
11a10 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
11a20 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
11a30 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73   if that list is
11a40 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74   constant..*/.st
11a50 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
11a60 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
11a70 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78  Expr *pIn){.  Ex
11a80 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20  pr *pLHS;.  int 
11a90 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21  res;.  assert( !
11aa0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
11ab0 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  pIn, EP_xIsSelec
11ac0 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70  t) );.  pLHS = p
11ad0 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e  In->pLeft;.  pIn
11ae0 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72  ->pLeft = 0;.  r
11af0 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  es = sqlite3Expr
11b00 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b  IsConstant(pIn);
11b10 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
11b20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72  pLHS;.  return r
11b30 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  es;.}.#endif../*
11b40 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11b50 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
11b60 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
11b70 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
11b80 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65  operator..** The
11b90 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73   pX parameter is
11ba0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11bb0 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
11bc0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  e IN operator, w
11bd0 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
11be0 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f   either a list o
11bf0 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72  f expressions or
11c00 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a   a subquery..**.
11c10 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
11c20 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
11c30 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
11c40 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  a b-tree object 
11c50 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75  that can.** be u
11c60 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65  sed either to te
11c70 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
11c80 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74  p in the RHS set
11c90 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
11ca0 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65  hrough.** all me
11cb0 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53  mbers of the RHS
11cc0 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64   set, skipping d
11cd0 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  uplicates..**.**
11ce0 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65   A cursor is ope
11cf0 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65  ned on the b-tre
11d00 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  e object that is
11d10 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
11d20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61  IN operator.** a
11d30 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73  nd pX->iTable is
11d40 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
11d50 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72  x of that cursor
11d60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
11d70 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  rned value of th
11d80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
11d90 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65  cates the b-tree
11da0 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77   type, as follow
11db0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e  s:.**.**   IN_IN
11dc0 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d  DEX_ROWID      -
11dd0 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
11de0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
11df0 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  base table..**  
11e00 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
11e10 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f  ASC  - The curso
11e20 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
11e30 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
11e40 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
11e50 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54  X_INDEX_DESC - T
11e60 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
11e70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e  ened on a descen
11e80 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
11e90 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20   IN_INDEX_EPH   
11ea0 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
11eb0 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
11ec0 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
11ed0 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68     populated eph
11f00 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  eremal table..**
11f10 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50     IN_INDEX_NOOP
11f20 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73         - No curs
11f30 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  or was allocated
11f40 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  .  The IN operat
11f50 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20  or must be.**   
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f70 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65        implemente
11f80 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20  d as a sequence 
11f90 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
11fa0 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
11fb0 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62  g b-tree might b
11fc0 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48  e used if the RH
11fd0 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20  S expression pX 
11fe0 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73  is a simple.** s
11ff0 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a  ubquery such as:
12000 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
12010 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f  T <column1>, <co
12020 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c  lumn2>... FROM <
12030 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20  table>.**.** If 
12040 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12050 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
12060 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63  list or a more c
12070 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c  omplex subquery,
12080 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65   then.** an ephe
12090 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68  meral table migh
120a0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e  t need to be gen
120b0 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
120c0 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20  RHS and then.** 
120d0 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20  pX->iTable made 
120e0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
120f0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
12100 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a  instead of an.**
12110 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e   existing table.
12120 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61  .**.** The inFla
12130 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73  gs parameter mus
12140 74 20 63 6f 6e 74 61 69 6e 2c 20 61 74 20 61 20  t contain, at a 
12150 6d 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20  minimum, one of 
12160 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49  the bits.** IN_I
12170 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
12180 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  or IN_INDEX_LOOP
12190 20 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 20 20   but not both.  
121a0 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61  If inFlags conta
121b0 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  ins.** IN_INDEX_
121c0 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e  MEMBERSHIP, then
121d0 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74   the generated t
121e0 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  able will be use
121f0 64 20 66 6f 72 20 61 20 66 61 73 74 0a 2a 2a 20  d for a fast.** 
12200 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e  membership test.
12210 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e    When the IN_IN
12220 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20  DEX_LOOP bit is 
12230 73 65 74 2c 20 74 68 65 20 49 4e 20 69 6e 64 65  set, the IN inde
12240 78 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65  x will.** be use
12250 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61  d to loop over a
12260 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  ll values of the
12270 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
12280 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  perator..**.** W
12290 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  hen IN_INDEX_LOO
122a0 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
122b0 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
122c0 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
122d0 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
122e0 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68   set members) th
122f0 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  en the b-tree mu
12300 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64  st not contain d
12310 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e  uplicates..** An
12320 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
12330 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
12340 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65   unless the sele
12350 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  cted columns are
12360 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
12370 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69  o be unique - ei
12380 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20  ther because it 
12390 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
123a0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65  IMARY KEY or due
123b0 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20   to.** a UNIQUE 
123c0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e  constraint or in
123d0 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  dex..**.** When 
123e0 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
123f0 48 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64  HIP is used (and
12400 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
12410 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72   be used .** for
12420 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72   fast set member
12430 73 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e  ship tests) then
12440 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   an epheremal ta
12450 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20  ble must .** be 
12460 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c  used unless <col
12470 75 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c  umns> is a singl
12480 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
12490 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20  Y KEY column or 
124a0 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e  an .** index can
124b0 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74   be found with t
124c0 68 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f  he specified <co
124d0 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65  lumns> as its le
124e0 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ft-most..**.** I
124f0 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e  f the IN_INDEX_N
12500 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e  OOP_OK and IN_IN
12510 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61  DEX_MEMBERSHIP a
12520 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a  re both set and.
12530 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66  ** if the RHS of
12540 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
12550 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20   is a list (not 
12560 61 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e  a subquery) then
12570 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
12580 20 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68   might decide th
12590 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65  at creating an e
125a0 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20  phemeral b-tree 
125b0 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a  for membership.*
125c0 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f  * testing is too
125d0 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72   expensive and r
125e0 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e  eturn IN_INDEX_N
125f0 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61  OOP.  In that ca
12600 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69  se, the.** calli
12610 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  ng routine shoul
12620 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  d implement the 
12630 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e  IN operator usin
12640 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  g a sequence.** 
12650 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70  of Eq or Ne comp
12660 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
12670 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
12680 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e  e b-tree is bein
12690 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65  g used for membe
126a0 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65  rship tests, the
126b0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
126c0 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20  n.** might need 
126d0 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20  to know whether 
126e0 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73  or not the RHS s
126f0 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ide of the IN op
12700 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69  erator.** contai
12710 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70  ns a NULL.  If p
12720 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e  rRhsHasNull is n
12730 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ot a NULL pointe
12740 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65  r and .** if the
12750 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65  re is any chance
12760 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
12770 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20  might contain a 
12780 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a  NULL value at.**
12790 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61   runtime, then a
127a0 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
127b0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72  ocated and the r
127c0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
127d0 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72  ritten.** to *pr
127e0 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74  RhsHasNull. If t
127f0 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
12800 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
12810 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e   contains a.** N
12820 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ULL value, then 
12830 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73  *prRhsHasNull is
12840 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
12850 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
12860 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
12870 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69  d and its locati
12880 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72  on stored in *pr
12890 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e  RhsHasNull, then
128a0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e  .** the value in
128b0 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77   that register w
128c0 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
128d0 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69  he b-tree contai
128e0 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  ns one or more.*
128f0 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61  * NULL values, a
12900 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f  nd it will be so
12910 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75  me non-NULL valu
12920 65 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20  e if the b-tree 
12930 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e  contains no.** N
12940 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a  ULL values..**.*
12950 2a 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70  * If the aiMap p
12960 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
12970 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f  NULL, it must po
12980 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20  int to an array 
12990 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e  containing.** on
129a0 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61  e element for ea
129b0 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e  ch column return
129c0 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
129d0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68   statement on th
129e0 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20  e RHS.** of the 
129f0 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  IN(...) operator
12a00 2e 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79  . The i'th entry
12a10 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73   of the array is
12a20 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
12a30 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66  the.** offset of
12a40 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
12a50 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  n that matches t
12a60 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72  he i'th column r
12a70 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a  eturned by the.*
12a80 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78  * SELECT. For ex
12a90 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78  ample, if the ex
12aa0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c  pression and sel
12ab0 65 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a  ected index are:
12ac0 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29  .**.**   (?,?,?)
12ad0 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62   IN (SELECT a, b
12ae0 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20  , c FROM t1).** 
12af0 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
12b00 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29  1 ON t1(b, c, a)
12b10 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d  ;.**.** then aiM
12b20 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65  ap[] is populate
12b30 64 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d  d with {2, 0, 1}
12b40 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
12b50 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
12b60 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  Y.int sqlite3Fin
12b70 64 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73  dInIndex(.  Pars
12b80 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12b90 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
12ba0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
12bb0 78 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20  xpr *pX,        
12bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12bd0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
12be0 20 28 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e   (RHS) of the IN
12bf0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75   operator */.  u
12c00 33 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20  32 inFlags,     
12c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f            /* IN_
12c20 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d  INDEX_LOOP, _MEM
12c30 42 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20  BERSHIP, and/or 
12c40 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e  _NOOP_OK */.  in
12c50 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c  t *prRhsHasNull,
12c60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
12c70 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c  ster holding NUL
12c80 4c 20 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e  L status.  See n
12c90 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  otes */.  int *a
12ca0 69 4d 61 70 20 20 20 20 20 20 20 20 20 20 20 20  iMap            
12cb0 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
12cc0 66 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64  from Index field
12cd0 73 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20  s to RHS fields 
12ce0 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  */.){.  Select *
12cf0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12d10 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72   SELECT to the r
12d20 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61  ight of IN opera
12d30 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  tor */.  int eTy
12d40 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pe = 0;         
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d60 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61  * Type of RHS ta
12d70 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20  ble. IN_INDEX_* 
12d80 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
12d90 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
12da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
12db0 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20  rsor of the RHS 
12dc0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d  table */.  int m
12dd0 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20  ustBeUnique;    
12de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12df0 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20   /* True if RHS 
12e00 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a  must be unique *
12e10 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
12e20 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
12e30 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72  rse);     /* Vir
12e40 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69  tual machine bei
12e50 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61  ng coded */..  a
12e60 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
12e70 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65  K_IN );.  mustBe
12e80 55 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67  Unique = (inFlag
12e90 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  s & IN_INDEX_LOO
12ea0 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  P)!=0;..  /* If 
12eb0 74 68 65 20 52 48 53 20 6f 66 20 74 68 69 73 20  the RHS of this 
12ec0 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  IN(...) operator
12ed0 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61 6e   is a SELECT, an
12ee0 64 20 69 66 20 69 74 20 6d 61 74 74 65 72 73 20  d if it matters 
12ef0 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  .  ** whether or
12f00 20 6e 6f 74 20 74 68 65 20 53 45 4c 45 43 54 20   not the SELECT 
12f10 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20  result contains 
12f20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68 65  NULL values, che
12f30 63 6b 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20  ck whether.  ** 
12f40 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61  or not NULL is a
12f50 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  ctually possible
12f60 20 28 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c   (it may not be,
12f70 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64 75   for example, du
12f80 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e  e .  ** to NOT N
12f90 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
12fa0 69 6e 20 74 68 65 20 73 63 68 65 6d 61 29 2e 20  in the schema). 
12fb0 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  If no NULL value
12fc0 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a  s are possible,.
12fd0 20 20 2a 2a 20 73 65 74 20 70 72 52 68 73 48 61    ** set prRhsHa
12fe0 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72  sNull to 0 befor
12ff0 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a  e continuing.  *
13000 2f 0a 20 20 69 66 28 20 70 72 52 68 73 48 61 73  /.  if( prRhsHas
13010 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61  Null && (pX->fla
13020 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
13030 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  t) ){.    int i;
13040 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
13050 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53  EList = pX->x.pS
13060 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
13070 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
13080 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
13090 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
130a0 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
130b0 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  l(pEList->a[i].p
130c0 45 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20  Expr) ) break;. 
130d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
130e0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
130f0 0a 20 20 20 20 20 20 70 72 52 68 73 48 61 73 4e  .      prRhsHasN
13100 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ull = 0;.    }. 
13110 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
13120 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73  o see if an exis
13130 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
13140 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
13150 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20  to.  ** satisfy 
13160 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73  the query.  This
13170 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74   is preferable t
13180 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e  o generating a n
13190 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72  ew .  ** ephemer
131a0 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  al table.  */.  
131b0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
131c0 3d 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43 61  ==0 && (p = isCa
131d0 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
131e0 70 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  pX))!=0 ){.    s
131f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
13200 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
13210 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
13220 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
13230 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
13260 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  ble <table>. */.
13270 20 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20      i16 iDb;    
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
132a0 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70  tabase idx for p
132b0 54 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c  Tab */.    ExprL
132c0 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d  ist *pEList = p-
132d0 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  >pEList;.    int
132e0 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
132f0 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73  >nExpr;..    ass
13300 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d  ert( p->pEList!=
13310 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
13320 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
13330 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
13340 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
13350 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
13360 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
13370 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
13380 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
13390 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
133a0 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20  ert( p->pSrc!=0 
133b0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
133c0 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
133d0 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
133e0 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61  pt(p) */.    pTa
133f0 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
13400 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20  ].pTab;..    /* 
13410 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73  Code an OP_Trans
13420 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61  action and OP_Ta
13430 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62  bleLock for <tab
13440 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20  le>. */.    iDb 
13450 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
13460 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
13470 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73  >pSchema);.    s
13480 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
13490 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
134a0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
134b0 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
134c0 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
134d0 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
134e0 65 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  e);..    assert(
134f0 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47  v);  /* sqlite3G
13500 65 74 56 64 62 65 28 29 20 68 61 73 20 61 6c 77  etVdbe() has alw
13510 61 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75  ays been previou
13520 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20  sly called */.  
13530 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26    if( nExpr==1 &
13540 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  & pEList->a[0].p
13550 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
13560 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
13570 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f  "x IN (SELECT ro
13580 77 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22  wid FROM table)"
13590 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69   case */.      i
135a0 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
135b0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
135c0 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20  OP_Once);.      
135d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
135e0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ..      sqlite3O
135f0 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
13600 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
13610 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
13620 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
13630 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20  _INDEX_ROWID;.. 
13640 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13650 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
13660 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
13670 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
13680 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
136a0 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
136b0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69  /.      int affi
136c0 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20  nity_ok = 1;.   
136d0 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20     int i;..     
136e0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
136f0 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  he affinity that
13700 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
13710 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20 0a 20   perform each . 
13720 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
13730 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  on is the same a
13740 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
13750 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e  f each column in
13760 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
13770 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
13780 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20  e IN operator.  
13790 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20 69 73  If it not, it is
137a0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
137b0 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 61 6e  .      ** use an
137c0 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 52  y index of the R
137d0 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  HS table.  */.  
137e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
137f0 45 78 70 72 20 26 26 20 61 66 66 69 6e 69 74 79  Expr && affinity
13800 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  _ok; i++){.     
13810 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20     Expr *pLhs = 
13820 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
13830 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c  ldSubexpr(pX->pL
13840 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  eft, i);.       
13850 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69   int iCol = pELi
13860 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
13870 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
13880 20 63 68 61 72 20 69 64 78 61 66 66 20 3d 20 73   char idxaff = s
13890 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d  qlite3TableColum
138a0 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62 2c 69  nAffinity(pTab,i
138b0 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61 62  Col); /* RHS tab
138c0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  le */.        ch
138d0 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71 6c 69  ar cmpaff = sqli
138e0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
138f0 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66 66 29  ty(pLhs, idxaff)
13900 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
13910 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49  se( cmpaff==SQLI
13920 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20  TE_AFF_BLOB );. 
13930 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
13940 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f   cmpaff==SQLITE_
13950 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
13960 20 20 20 20 73 77 69 74 63 68 28 20 63 6d 70 61      switch( cmpa
13970 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ff ){.          
13980 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
13990 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20  BLOB:.          
139a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
139b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
139c0 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20  FF_TEXT:.       
139d0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 43       /* sqlite3C
139e0 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 29  ompareAffinity()
139f0 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 54 45   only returns TE
13a00 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65 20 6f  XT if one side o
13a10 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  r the.          
13a20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73 20 6e    ** other has n
13a30 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 74  o affinity and t
13a40 68 65 20 6f 74 68 65 72 20 73 69 64 65 20 69 73  he other side is
13a50 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20   TEXT.  Hence,. 
13a60 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
13a70 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20 63  e only way for c
13a80 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45 58 54  mpaff to be TEXT
13a90 20 69 73 20 66 6f 72 20 69 64 78 61 66 66 20 74   is for idxaff t
13aa0 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20 20 20  o be TEXT.      
13ab0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72        ** and for
13ac0 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74 68 65   the term on the
13ad0 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 74   LHS of the IN t
13ae0 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69 6e 69  o have no affini
13af0 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ty. */.         
13b00 20 20 20 61 73 73 65 72 74 28 20 69 64 78 61 66     assert( idxaf
13b10 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f==SQLITE_AFF_TE
13b20 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  XT );.          
13b30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13b40 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
13b50 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
13b60 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  _ok = sqlite3IsN
13b70 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69  umericAffinity(i
13b80 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  dxaff);.        
13b90 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
13ba0 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b   if( affinity_ok
13bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
13bc0 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
13bd0 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  sting index that
13be0 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74   will work for t
13bf0 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  his IN operator 
13c00 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  */.        for(p
13c10 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
13c20 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d  ; pIdx && eType=
13c30 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  =0; pIdx=pIdx->p
13c40 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
13c50 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64   Bitmask colUsed
13c60 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ;      /* Column
13c70 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 75  s of the index u
13c80 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  sed */.         
13c90 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20   Bitmask mCol;  
13ca0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66         /* Mask f
13cb0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  or the current c
13cc0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20  olumn */.       
13cd0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f     if( pIdx->nCo
13ce0 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e  lumn<nExpr ) con
13cf0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
13d00 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c   /* Maximum nCol
13d10 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f  umn is BMS-2, no
13d20 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74  t BMS-1, so that
13d30 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a   we can compute.
13d40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49 54            ** BIT
13d50 4d 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74 68  MASK(nExpr) with
13d60 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20  out overflowing 
13d70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
13d80 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f  tcase( pIdx->nCo
13d90 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  lumn==BMS-2 );. 
13da0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
13db0 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  e( pIdx->nColumn
13dc0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
13dd0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
13de0 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20  Column>=BMS-1 ) 
13df0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13e00 20 20 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e      if( mustBeUn
13e10 69 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ique ){.        
13e20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
13e30 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20  eyCol>nExpr.    
13e40 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64 78           ||(pIdx
13e50 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20  ->nColumn>nExpr 
13e60 26 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65  && !IsUniqueInde
13e70 78 28 70 49 64 78 29 29 0a 20 20 20 20 20 20 20  x(pIdx)).       
13e80 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
13e90 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
13ea0 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
13eb0 73 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76 65  s not unique ove
13ec0 72 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f 6c  r the IN RHS col
13ed0 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  umns */.        
13ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13ef0 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 63  }.  .          c
13f00 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a  olUsed = 0;   /*
13f10 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65   Columns of inde
13f20 78 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a 2f  x used so far */
13f30 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
13f40 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
13f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
13f60 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
13f70 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
13f80 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
13f90 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
13fa0 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45   Expr *pRhs = pE
13fb0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
13fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 6f  ;.            Co
13fd0 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71  llSeq *pReq = sq
13fe0 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
13ff0 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
14000 2c 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20  , pLhs, pRhs);. 
14010 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
14020 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  ;.  .           
14030 20 61 73 73 65 72 74 28 20 70 52 65 71 21 3d 30   assert( pReq!=0
14040 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d   || pRhs->iColum
14050 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70  n==XN_ROWID || p
14060 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20  Parse->nErr );. 
14070 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
14080 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b  =0; j<nExpr; j++
14090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
140a0 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
140b0 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43  umn[j]!=pRhs->iC
140c0 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
140d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
140e0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a  assert( pIdx->az
140f0 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20  Coll[j] );.     
14100 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
14110 71 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  q!=0 && sqlite3S
14120 74 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61  trICmp(pReq->zNa
14130 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  me, pIdx->azColl
14140 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  [j])!=0 ){.     
14150 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
14160 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
14170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
14180 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
141a0 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72      if( j==nExpr
141b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
141c0 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53        mCol = MAS
141d0 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20 20  KBIT(j);.       
141e0 20 20 20 20 20 69 66 28 20 6d 43 6f 6c 20 26 20       if( mCol & 
141f0 63 6f 6c 55 73 65 64 20 29 20 62 72 65 61 6b 3b  colUsed ) break;
14200 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20   /* Each column 
14210 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  used only once *
14220 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  /.            co
14230 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20  lUsed |= mCol;. 
14240 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
14250 69 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20  iMap ) aiMap[i] 
14260 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = j;.          }
14270 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 61 73  .  .          as
14280 73 65 72 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c  sert( i==nExpr |
14290 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b  | colUsed!=(MASK
142a0 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 3b  BIT(nExpr)-1) );
142b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
142c0 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54  olUsed==(MASKBIT
142d0 28 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a 20 20  (nExpr)-1) ){.  
142e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
142f0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
14300 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
14310 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 20 69  the index pIdx i
14320 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20  s usable */.    
14330 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
14340 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
14350 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
14360 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
14370 76 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  v);.#ifndef SQLI
14380 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
14390 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
143a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
143b0 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30 2c 20   OP_Explain, 0, 
143c0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
143d0 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
143e0 74 66 28 64 62 2c 20 22 55 53 49 4e 47 20 49 4e  tf(db, "USING IN
143f0 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50  DEX %s FOR IN-OP
14400 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e  ERATOR",pIdx->zN
14410 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
14420 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b      P4_DYNAMIC);
14430 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
14440 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14450 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
14460 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78  Read, iTab, pIdx
14470 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
14480 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14490 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
144a0 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
144b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
144c0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
144d0 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
144e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
144f0 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49  sert( IN_INDEX_I
14500 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f  NDEX_DESC == IN_
14510 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b  INDEX_INDEX_ASC+
14520 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
14530 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
14540 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49  X_INDEX_ASC + pI
14550 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  dx->aSortOrder[0
14560 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  ];.  .          
14570 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75    if( prRhsHasNu
14580 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ll ){.#ifdef SQL
14590 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
145a0 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20  N_USED_MASK.    
145b0 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61            i64 ma
145c0 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d  sk = (1<<nExpr)-
145d0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
145e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
145f0 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
14600 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20  umnsUsed, .     
14610 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
14620 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d  b, 0, 0, (u8*)&m
14630 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  ask, P4_INT64);.
14640 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
14650 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75       *prRhsHasNu
14660 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
14670 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
14680 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20     if( nExpr==1 
14690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
146a0 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73     sqlite3SetHas
146b0 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62  NullFlag(v, iTab
146c0 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29  , *prRhsHasNull)
146d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
146e0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
146f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14700 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14710 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  v, iAddr);.     
14720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
14730 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* End loop ove
14740 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20  r indexes */.   
14750 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20     } /* End if( 
14760 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f  affinity_ok ) */
14770 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66  .    } /* End if
14780 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e   not an rowid in
14790 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e  dex */.  } /* En
147a0 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74  d attempt to opt
147b0 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69  imize using an i
147c0 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  ndex */..  /* If
147d0 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20   no preexisting 
147e0 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62  index is availab
147f0 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c  le for the IN cl
14800 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  ause.  ** and IN
14810 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61  _INDEX_NOOP is a
14820 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a  n allowed reply.
14830 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53    ** and the RHS
14840 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
14850 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e  tor is a list, n
14860 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20  ot a subquery.  
14870 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69  ** and the RHS i
14880 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f  s not constant o
14890 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77  r has two or few
148a0 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74  er terms,.  ** t
148b0 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f  hen it is not wo
148c0 72 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20  rth creating an 
148d0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
148e0 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a  to evaluate.  **
148f0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
14900 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e   so return IN_IN
14910 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20  DEX_NOOP..  */. 
14920 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20   if( eType==0.  
14930 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49   && (inFlags & I
14940 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29  N_INDEX_NOOP_OK)
14950 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50  .   && !ExprHasP
14960 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
14970 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20  IsSelect).   && 
14980 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  (!sqlite3InRhsIs
14990 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20  Constant(pX) || 
149a0 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pX->x.pList->nEx
149b0 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20  pr<=2).  ){.    
149c0 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
149d0 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
149e0 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
149f0 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66    /* Could not f
14a00 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ind an existing 
14a10 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
14a20 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53  o use as the RHS
14a30 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20   b-tree..    ** 
14a40 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  We will have to 
14a50 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65  generate an ephe
14a60 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64  meral table to d
14a70 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a  o the job..    *
14a80 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e  /.    u32 savedN
14a90 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
14aa0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
14ab0 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65      int rMayHave
14ac0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54  Null = 0;.    eT
14ad0 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45  ype = IN_INDEX_E
14ae0 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c  PH;.    if( inFl
14af0 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c  ags & IN_INDEX_L
14b00 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OOP ){.      pPa
14b10 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
14b20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
14b30 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  X->pLeft->iColum
14b40 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50  n<0 && !ExprHasP
14b50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
14b60 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
14b70 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
14b80 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20  INDEX_ROWID;.   
14b90 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
14ba0 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
14bb0 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48  ){.      *prRhsH
14bc0 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76  asNull = rMayHav
14bd0 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  eNull = ++pParse
14be0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  ->nMem;.    }.  
14bf0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
14c00 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
14c10 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  X, rMayHaveNull,
14c20 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
14c30 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61  _ROWID);.    pPa
14c40 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
14c50 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  = savedNQueryLoo
14c60 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  p;.  }else{.    
14c70 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pX->iTable = iTa
14c80 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69  b;.  }..  if( ai
14c90 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e  Map && eType!=IN
14ca0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
14cb0 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e   && eType!=IN_IN
14cc0 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29  DEX_INDEX_DESC )
14cd0 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  {.    int i, n;.
14ce0 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45      n = sqlite3E
14cf0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58  xprVectorSize(pX
14d00 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f  ->pLeft);.    fo
14d10 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
14d20 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20   aiMap[i] = i;. 
14d30 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70   }.  return eTyp
14d40 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  e;.}.#endif..#if
14d50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14d60 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
14d70 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69  Argument pExpr i
14d80 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49  s an (?, ?...) I
14d90 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  N(...) expressio
14da0 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  n. This .** func
14db0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
14dc0 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  nd returns a nul
14dd0 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
14de0 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a  ng containing .*
14df0 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73  * the affinities
14e00 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
14e10 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  each column of t
14e20 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a  he comparison..*
14e30 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  *.** It is the r
14e40 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
14e50 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
14e60 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72  nsure that the r
14e70 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e  eturned.** strin
14e80 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20  g is eventually 
14e90 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69  freed using sqli
14ea0 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a  te3DbFree()..*/.
14eb0 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70  static char *exp
14ec0 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73  rINAffinity(Pars
14ed0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
14ee0 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20  *pExpr){.  Expr 
14ef0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
14f00 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61  pLeft;.  int nVa
14f10 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  l = sqlite3ExprV
14f20 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29  ectorSize(pLeft)
14f30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  ;.  Select *pSel
14f40 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c  ect = (pExpr->fl
14f50 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
14f60 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ct) ? pExpr->x.p
14f70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68  Select : 0;.  ch
14f80 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73  ar *zRet;..  ass
14f90 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
14fa0 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20  TK_IN );.  zRet 
14fb0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
14fc0 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c  cRaw(pParse->db,
14fd0 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20   nVal+1);.  if( 
14fe0 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  zRet ){.    int 
14ff0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
15000 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVal; i++){.  
15010 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73      Expr *pA = s
15020 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
15030 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
15040 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61  i);.      char a
15050 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
15060 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20  finity(pA);.    
15070 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
15080 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d  .        zRet[i]
15090 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
150a0 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63  eAffinity(pSelec
150b0 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
150c0 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20  pExpr, a);.     
150d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
150e0 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20  zRet[i] = a;.   
150f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
15100 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27  Ret[nVal] = '\0'
15110 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
15120 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Ret;.}.#endif..#
15130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15140 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
15150 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65  * Load the Parse
15160 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
15170 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
15180 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72  ment with an err
15190 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f  or .** message o
151a0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
151b0 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20  *   "sub-select 
151c0 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e  returns N column
151d0 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a  s - expected M".
151e0 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74  */   .void sqlit
151f0 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
15200 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15210 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74  int nActual, int
15220 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e   nExpect){.  con
15230 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20  st char *zFmt = 
15240 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
15250 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d  rns %d columns -
15260 20 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20   expected %d";. 
15270 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15280 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e  (pParse, zFmt, n
15290 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29  Actual, nExpect)
152a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
152b0 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * Expression pEx
152c0 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 20 74  pr is a vector t
152d0 68 61 74 20 68 61 73 20 62 65 65 6e 20 75 73 65  hat has been use
152e0 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77  d in a context w
152f0 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  here.** it is no
15300 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20  t permitted. If 
15310 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73  pExpr is a sub-s
15320 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68  elect vector, th
15330 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c  is routine .** l
15340 6f 61 64 73 20 74 68 65 20 50 61 72 73 65 20 6f  oads the Parse o
15350 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65 73  bject with a mes
15360 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  sage of the form
15370 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73  :.**.**   "sub-s
15380 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20  elect returns N 
15390 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
153a0 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ed 1".**.** Or, 
153b0 69 66 20 69 74 20 69 73 20 61 20 72 65 67 75 6c  if it is a regul
153c0 61 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72  ar scalar vector
153d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76  :.**.**   "row v
153e0 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f  alue misused".*/
153f0 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33     .void sqlite3
15400 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50  VectorErrorMsg(P
15410 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
15420 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e  pr *pExpr){.#ifn
15430 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15440 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70  SUBQUERY.  if( p
15450 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
15460 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20  _xIsSelect ){.  
15470 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
15480 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
15490 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
154a0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
154b0 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e   1);.  }else.#en
154c0 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
154d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
154e0 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
154f0 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a  isused");.  }.}.
15500 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15510 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
15520 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
15530 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78  as a subquery ex
15540 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53  pression, EXISTS
15550 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61  ,.** or IN opera
15560 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a  tors.  Examples:
15570 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45  .**.**     (SELE
15580 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
15590 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72        -- subquer
155a0 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20  y.**     EXISTS 
155b0 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
155c0 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75  )   -- EXISTS su
155d0 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20  bquery.**     x 
155e0 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
155f0 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
15600 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
15610 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
15620 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
15630 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
15640 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
15650 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
15660 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
15670 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
15680 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72   parameter descr
15690 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ibes the express
156a0 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
156b0 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72  s the IN.** oper
156c0 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79  ator or subquery
156d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
156e0 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20  eter isRowid is 
156f0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65  non-zero, then e
15700 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
15710 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
15720 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f   to be of the fo
15730 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28  rm "<rowid> IN (
15740 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65  ?, ?, ?)", where
15750 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65   <rowid> is a re
15760 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f  ference.** to so
15770 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63  me integer key c
15780 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
15790 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73   B-Tree. In this
157a0 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a   case, use an.**
157b0 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74   intkey B-Tree t
157c0 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
157d0 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65  of IN(...) value
157e0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  s instead of the
157f0 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65   usual.** (slowe
15800 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  r) variable leng
15810 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a  th keys B-Tree..
15820 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76  **.** If rMayHav
15830 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72  eNull is non-zer
15840 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
15850 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  at the operation
15860 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f   is an IN.** (no
15870 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  t a SELECT or EX
15880 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74  ISTS) and that t
15890 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e  he RHS might con
158a0 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20  tains NULLs..** 
158b0 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
158c0 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c   does is initial
158d0 69 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72  ize the register
158e0 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61   given by rMayHa
158f0 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c  veNull.** to NUL
15900 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74  L.  Calling rout
15910 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63  ines will take c
15920 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20  are of changing 
15930 74 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a  this register.**
15940 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55   value to non-NU
15950 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73  LL if the RHS is
15960 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a   NULL-free..**.*
15970 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f  * For a SELECT o
15980 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
15990 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  r, return the re
159a0 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
159b0 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e  s the.** result.
159c0 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f    For a multi-co
159d0 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65  lumn SELECT, the
159e0 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
159f0 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75  d in a contiguou
15a00 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65  s.** array of re
15a10 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
15a20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
15a30 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
15a40 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
15a50 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20   result column. 
15a60 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e   Return 0 for IN
15a70 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66   operators or if
15a80 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
15a90 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
15aa0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
15ab0 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  Y.int sqlite3Cod
15ac0 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61  eSubselect(.  Pa
15ad0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15ae0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
15af0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
15b00 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
15b10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c        /* The IN,
15b20 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53   SELECT, or EXIS
15b30 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  TS operator */. 
15b40 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61   int rHasNullFla
15b50 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  g,       /* Regi
15b60 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64  ster that record
15b70 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20  s whether NULLs 
15b80 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a  exist in RHS */.
15b90 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20    int isRowid   
15ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
15bb0 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20  true, LHS of IN 
15bc0 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f  operator is a ro
15bd0 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  wid */.){.  int 
15be0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
15bf0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
15c00 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
15c10 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
15c20 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d   */.  int rReg =
15c30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15c50 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e   Register storin
15c60 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20  g resulting */. 
15c70 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
15c80 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
15c90 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
15ca0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
15cb0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
15cc0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
15cd0 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75  ..  /* The evalu
15ce0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f  ation of the IN/
15cf0 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75  EXISTS/SELECT mu
15d00 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65  st be repeated e
15d10 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a  very time it.  *
15d20 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
15d30 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
15d40 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
15d50 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
15d60 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
15d70 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
15d80 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
15d90 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
15da0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
15db0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
15dc0 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
15dd0 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
15de0 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
15df0 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
15e00 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
15e10 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
15e20 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
15e30 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
15e40 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
15e50 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
15e60 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
15e70 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
15e80 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
15e90 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
15ea0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15eb0 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
15ec0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70  lect) ){.    jmp
15ed0 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69  IfDynamic = sqli
15ee0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
15ef0 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
15f00 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
15f10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15f20 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
15f30 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
15f40 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61  in==2 ){.    cha
15f50 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
15f60 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
15f70 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20 25 73  >db, "EXECUTE %s
15f80 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c  %s SUBQUERY %d",
15f90 0a 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79  .        jmpIfDy
15fa0 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52  namic>=0?"":"COR
15fb0 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20  RELATED ",.     
15fc0 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
15fd0 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c  _IN?"LIST":"SCAL
15fe0 41 52 22 2c 0a 20 20 20 20 20 20 20 20 70 50 61  AR",.        pPa
15ff0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
16000 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  Id.    );.    sq
16010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
16020 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
16030 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
16040 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
16050 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23  _DYNAMIC);.  }.#
16060 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28  endif..  switch(
16070 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
16080 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
16090 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20        int addr; 
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160b0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
160c0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
160d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
160e0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
160f0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
16100 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20  ; /* the LHS of 
16110 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
16120 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  */.      KeyInfo
16130 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
16140 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f       /* Key info
16150 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  rmation */.     
16160 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20   int nVal;      
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16180 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70  Size of vector p
16190 4c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 0a 20  Left */.      . 
161a0 20 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69       nVal = sqli
161b0 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
161c0 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  e(pLeft);.      
161d0 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
161e0 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a   || nVal==1 );..
161f0 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72        /* Whether
16200 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49   this is an 'x I
16210 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72  N(SELECT...)' or
16220 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c   an 'x IN(<exprl
16230 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20  ist>)'.      ** 
16240 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73  expression it is
16250 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d   handled the sam
16260 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d  e way.  An ephem
16270 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20  eral table is . 
16280 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77       ** filled w
16290 69 74 68 20 69 6e 64 65 78 20 6b 65 79 73 20 72  ith index keys r
162a0 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
162b0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
162c0 20 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43   .      ** SELEC
162d0 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69  T or the <exprli
162e0 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  st>..      **.  
162f0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78      ** If the 'x
16300 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ' expression is 
16310 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
16320 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
16330 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
16340 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f  ent returns a co
16350 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e  lumn value, then
16360 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
16370 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
16380 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f  olumn is used to
16390 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78   build the index
163a0 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27   keys. If both '
163b0 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20  x' and the.     
163c0 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74   ** SELECT... st
163d0 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
163e0 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
163f0 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73  c affinity is us
16400 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65  ed.      ** if e
16410 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73  ither column has
16420 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45   NUMERIC or INTE
16430 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66  GER affinity. If
16440 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a   neither.      *
16450 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45  * 'x' nor the SE
16460 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
16470 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
16480 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
16490 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73  nity.      ** is
164a0 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   used..      */.
164b0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
164c0 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ble = pParse->nT
164d0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72  ab++;.      addr
164e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
164f0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
16500 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20  phemeral, .     
16510 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
16520 6c 65 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e  le, (isRowid?0:n
16530 56 61 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b 65  Val));.      pKe
16540 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20  yInfo = isRowid 
16550 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79  ? 0 : sqlite3Key
16560 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
16570 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a  ->db, nVal, 1);.
16580 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
16590 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
165a0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
165b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
165c0 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
165d0 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
165e0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
165f0 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
16600 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
16610 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
16620 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
16630 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
16640 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
16650 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
16660 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
16670 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
16680 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72  *pSelect = pExpr
16690 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
166a0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
166b0 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
166c0 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20  >pEList;..      
166d0 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77    assert( !isRow
166e0 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  id );.        /*
166f0 20 49 66 20 74 68 65 20 4c 48 53 20 61 6e 64 20   If the LHS and 
16700 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
16710 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61  erator do not ma
16720 74 63 68 2c 20 74 68 61 74 0a 20 20 20 20 20 20  tch, that.      
16730 20 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20    ** error will 
16740 68 61 76 65 20 62 65 65 6e 20 63 61 75 67 68 74  have been caught
16750 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77 65 20   long before we 
16760 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
16770 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
16780 20 41 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e   ALWAYS(pEList->
16790 6e 45 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a  nExpr==nVal) ){.
167a0 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
167b0 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
167c0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
167d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
167e0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
167f0 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
16800 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
16810 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53        dest.zAffS
16820 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69  dst = exprINAffi
16830 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78  nity(pParse, pEx
16840 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pr);.          p
16850 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d  Select->iLimit =
16860 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   0;.          te
16870 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d  stcase( pSelect-
16880 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
16890 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
168a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
168b0 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a  KeyInfo==0 ); /*
168c0 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69   Caused by OOM i
168d0 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  n sqlite3KeyInfo
168e0 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20  Alloc() */.     
168f0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
16900 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
16910 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29  Select, &dest) )
16920 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
16930 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
16940 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66  se->db, dest.zAf
16950 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20  fSdst);.        
16960 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
16970 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f  foUnref(pKeyInfo
16980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
16990 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
169a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
169b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
169c0 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
169d0 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
169e0 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
169f0 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d  nfo!=0 ); /* OOM
16a00 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74   will cause exit
16a10 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53 65   after sqlite3Se
16a20 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  lect() */.      
16a30 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
16a40 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
16a50 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
16a60 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
16a70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16a80 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
16a90 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
16aa0 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fo) );.         
16ab0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c   for(i=0; i<nVal
16ac0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16ad0 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
16ae0 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
16af0 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
16b00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
16b10 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
16b20 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  ] = sqlite3Binar
16b30 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
16b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16b50 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69   pParse, p, pELi
16b60 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20  st->a[i].pExpr. 
16b70 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
16b80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16b90 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
16ba0 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
16bb0 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b  ->x.pList!=0) ){
16bc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
16bd0 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   2:     expr IN 
16be0 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20  (exprlist).     
16bf0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
16c00 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
16c10 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
16c20 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
16c30 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
16c40 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
16c50 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
16c60 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
16c70 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
16c80 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
16c90 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c       ** that col
16ca0 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68  umns affinity wh
16cb0 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65  en building inde
16cc0 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72  x keys. If <expr
16cd0 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  > is not.       
16ce0 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
16cf0 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
16d00 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ty..        */. 
16d10 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69         char affi
16d20 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  nity;           
16d30 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20   /* Affinity of 
16d40 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
16d50 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  N */.        int
16d60 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
16d70 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
16d80 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
16d90 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
16da0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
16db0 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  m;.        int r
16dc0 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20  1, r2, r3;..    
16dd0 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
16de0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
16df0 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  ty(pLeft);.     
16e00 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
16e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
16e20 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
16e30 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20  AFF_BLOB;.      
16e40 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
16e50 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
16e60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
16e70 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
16e80 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f  iteable(pKeyInfo
16e90 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
16ea0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
16eb0 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
16ec0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
16ed0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
16ee0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
16ef0 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
16f00 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
16f10 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
16f20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  */.        r1 = 
16f30 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16f40 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
16f50 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
16f60 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
16f70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
16f80 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33  sRowid ) sqlite3
16f90 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16fa0 5f 42 6c 6f 62 2c 20 30 2c 20 72 32 2c 20 30 2c  _Blob, 0, r2, 0,
16fb0 20 22 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b   "", P4_STATIC);
16fc0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
16fd0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
16fe0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
16ff0 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
17000 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
17010 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
17020 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
17030 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20  nt iValToIns;.. 
17040 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
17050 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
17060 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
17070 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
17080 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
17090 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
170a0 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
170b0 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
170c0 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
170d0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
170e0 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
170f0 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
17100 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
17110 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
17120 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
17130 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
17140 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
17150 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
17160 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44        if( jmpIfD
17170 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71  ynamic>=0 && !sq
17180 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
17190 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
171a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
171b0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
171c0 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29  v, jmpIfDynamic)
171d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  ;.            jm
171e0 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b  pIfDynamic = -1;
171f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
17200 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
17210 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
17220 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
17230 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
17240 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
17250 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26    if( isRowid &&
17260 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
17270 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c  teger(pE2, &iVal
17280 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20  ToIns) ){.      
17290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
172a0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
172b0 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e  sertInt, pExpr->
172c0 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c  iTable, r2, iVal
172d0 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  ToIns);.        
172e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
172f0 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
17300 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
17310 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
17320 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
17330 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
17340 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17350 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17360 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33  OP_MustBeInt, r3
17370 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17390 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
173a0 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
173c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
173e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
173f0 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78  , OP_Insert, pEx
17400 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
17410 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r3);.           
17420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17430 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17440 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
17450 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c  keRecord, r3, 1,
17460 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
17470 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
17480 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
17490 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
174a0 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b  (pParse, r3, 1);
174b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
174c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
174d0 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
174e0 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
174f0 6c 65 2c 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a  le, r2, r3, 1);.
17500 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
17510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17520 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
17530 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17540 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
17550 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
17560 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
17570 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
17580 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  }.      if( pKey
17590 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
175a0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
175b0 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP4(v, addr, (vo
175c0 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  id *)pKeyInfo, P
175d0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
175e0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
175f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
17600 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
17610 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
17620 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
17630 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20       /* Case 3: 
17640 20 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46     (SELECT ... F
17650 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a  ROM ...).      *
17660 2a 20 20 20 20 20 6f 72 3a 20 20 20 20 45 58 49  *     or:    EXI
17670 53 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  STS(SELECT ... F
17680 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a  ROM ...).      *
17690 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
176a0 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74   SELECT, generat
176b0 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
176c0 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c  e values for all
176d0 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20   columns of.    
176e0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72    ** the first r
176f0 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ow into an array
17700 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e   of registers an
17710 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64  d return the ind
17720 65 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ex of.      ** t
17730 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
17740 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
17750 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
17760 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65  an EXISTS, write
17770 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e   an integer 0 (n
17780 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20  ot exists) or 1 
17790 28 65 78 69 73 74 73 29 0a 20 20 20 20 20 20 2a  (exists).      *
177a0 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
177b0 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  r and return tha
177c0 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
177d0 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
177e0 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73    ** In both cas
177f0 65 73 2c 20 74 68 65 20 71 75 65 72 79 20 69 73  es, the query is
17800 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20   augmented with 
17810 22 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79 20  "LIMIT 1".  Any 
17820 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 65 78 69  .      ** preexi
17830 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 64  sting limit is d
17840 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61 63  iscarded in plac
17850 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49 4d  e of the new LIM
17860 49 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  IT 1..      */. 
17870 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
17880 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
17890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
178a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
178b0 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20  o encode */.    
178c0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
178d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
178e0 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
178f0 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45  o deal with SELE
17900 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  CT result */.   
17910 20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20     int nReg;    
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17930 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
17940 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
17950 65 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  e */.      Expr 
17960 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  *pLimit;        
17970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17980 20 2f 2a 20 4e 65 77 20 6c 69 6d 69 74 20 65 78   /* New limit ex
17990 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20 20  pression */..   
179a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
179b0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
179c0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
179d0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
179e0 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
179f0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
17a00 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
17a10 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
17a20 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
17a30 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
17a40 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17a50 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
17a60 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ..      pSel = p
17a70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
17a80 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70 45  .      nReg = pE
17a90 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
17aa0 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73  CT ? pSel->pELis
17ab0 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20  t->nExpr : 1;.  
17ac0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
17ad0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
17ae0 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d   0, pParse->nMem
17af0 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  +1);.      pPars
17b00 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
17b10 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
17b20 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
17b30 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  ){.        dest.
17b40 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b  eDest = SRT_Mem;
17b50 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69 53  .        dest.iS
17b60 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61  dst = dest.iSDPa
17b70 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  rm;.        dest
17b80 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20  .nSdst = nReg;. 
17b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17ba0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
17bb0 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ull, 0, dest.iSD
17bc0 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50 61  Parm, dest.iSDPa
17bd0 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20  rm+nReg-1);.    
17be0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
17bf0 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65  (v, "Init subque
17c00 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
17c10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17c20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
17c30 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20  SRT_Exists;.    
17c40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17c50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
17c60 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ger, 0, dest.iSD
17c70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
17c80 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
17c90 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75  Init EXISTS resu
17ca0 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lt"));.      }. 
17cb0 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 73 71       pLimit = sq
17cc0 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
17cd0 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e  Parse->db, TK_IN
17ce0 54 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49 6e  TEGER,&sqlite3In
17cf0 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a  tTokens[1], 0);.
17d00 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e        if( pSel->
17d10 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
17d20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
17d30 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
17d40 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c  pSel->pLimit->pL
17d50 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 70 53  eft);.        pS
17d60 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  el->pLimit->pLef
17d70 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
17d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17d90 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSel->pLimit = 
17da0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
17db0 72 73 65 2c 20 54 4b 5f 4c 49 4d 49 54 2c 20 70  rse, TK_LIMIT, p
17dc0 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20  Limit, 0);.     
17dd0 20 7d 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69   }.      pSel->i
17de0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
17df0 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
17e00 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75  &= ~SF_MultiValu
17e10 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  e;.      if( sql
17e20 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
17e30 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20  e, pSel, &dest) 
17e40 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
17e50 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
17e60 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69     rReg = dest.i
17e70 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78  SDParm;.      Ex
17e80 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
17e90 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
17ea0 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  uce);.      brea
17eb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
17ec0 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  if( rHasNullFlag
17ed0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
17ee0 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c  etHasNullFlag(v,
17ef0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
17f00 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20  rHasNullFlag);. 
17f10 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44   }..  if( jmpIfD
17f20 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20  ynamic>=0 ){.   
17f30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
17f40 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e  Here(v, jmpIfDyn
17f50 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  amic);.  }.  sql
17f60 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
17f70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74  (pParse);..  ret
17f80 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64  urn rReg;.}.#end
17f90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
17fa0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
17fb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17fc0 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
17fd0 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e  * Expr pIn is an
17fe0 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73   IN(...) express
17ff0 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ion. This functi
18000 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  on checks that t
18010 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63  he .** sub-selec
18020 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
18030 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f  the IN() operato
18040 72 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  r has the same n
18050 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c  umber of .** col
18060 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74  umns as the vect
18070 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f  or on the LHS. O
18080 72 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66  r, if the RHS of
18090 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74   the IN() is not
180a0 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79   .** a sub-query
180b0 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69  , that the LHS i
180c0 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69  s a vector of si
180d0 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ze 1..*/.int sql
180e0 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28  ite3ExprCheckIN(
180f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
18100 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74  xpr *pIn){.  int
18110 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nVector = sqlit
18120 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
18130 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  (pIn->pLeft);.  
18140 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20  if( (pIn->flags 
18150 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
18160 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74  ){.    if( nVect
18170 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65  or!=pIn->x.pSele
18180 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
18190 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
181a0 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
181b0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e  (pParse, pIn->x.
181c0 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
181d0 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29  >nExpr, nVector)
181e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
181f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
18200 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29  if( nVector!=1 )
18210 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65 63  {.    sqlite3Vec
18220 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72  torErrorMsg(pPar
18230 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b  se, pIn->pLeft);
18240 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
18250 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
18260 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
18270 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
18280 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
18290 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
182a0 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   IN expression..
182b0 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
182c0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20  (SELECT ...).** 
182d0 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65       x IN (value
182e0 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a  , value, ...).**
182f0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  .** The left-han
18300 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20  d side (LHS) is 
18310 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74  a scalar or vect
18320 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  or expression.  
18330 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61  The .** right-ha
18340 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 69 73  nd side (RHS) is
18350 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72   an array of zer
18360 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72  o or more scalar
18370 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a   values, or a.**
18380 20 73 75 62 71 75 65 72 79 2e 20 20 49 66 20 74   subquery.  If t
18390 68 65 20 52 48 53 20 69 73 20 61 20 73 75 62 71  he RHS is a subq
183a0 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  uery, the number
183b0 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
183c0 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68  ns must.** match
183d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
183e0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65  olumns in the ve
183f0 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e  ctor on the LHS.
18400 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73 0a    If the RHS is.
18410 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c  ** a list of val
18420 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73  ues, the LHS mus
18430 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a  t be a scalar. .
18440 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65  **.** The IN ope
18450 72 61 74 6f 72 20 69 73 20 74 72 75 65 20 69 66  rator is true if
18460 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69   the LHS value i
18470 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  s contained with
18480 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54  in the RHS..** T
18490 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c  he result is fal
184a0 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  se if the LHS is
184b0 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20   definitely not 
184c0 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65  in the RHS.  The
184d0 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e   .** result is N
184e0 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73 65  ULL if the prese
184f0 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69  nce of the LHS i
18500 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74  n the RHS cannot
18510 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   be .** determin
18520 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e  ed due to NULLs.
18530 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18540 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
18550 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f  de that jumps to
18560 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20   destIfFalse if 
18570 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a  the LHS is not .
18580 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
18590 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66  hin the RHS.  If
185a0 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65   due to NULLs we
185b0 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
185c0 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20  e if the LHS.** 
185d0 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
185e0 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d  the RHS then jum
185f0 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e  p to destIfNull.
18600 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20    If the LHS is 
18610 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74  contained.** wit
18620 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e  hin the RHS then
18630 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a   fall through..*
18640 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70  *.** See the sep
18650 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f  arate in-operato
18660 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69  r.md documentati
18670 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63  on file in the c
18680 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69  anonical.** SQLi
18690 74 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 66  te source tree f
186a0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
186b0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
186c0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
186d0 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50  3ExprCodeIN(.  P
186e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
186f0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
18700 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
18710 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
18720 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
18730 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
18740 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
18750 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
18760 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ,      /* Jump h
18770 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f  ere if LHS is no
18780 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
18790 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
187a0 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20  destIfNull      
187b0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
187c0 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
187d0 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f  e unknown due to
187e0 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69   NULLs */.){.  i
187f0 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d  nt rRhsHasNull =
18800 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72   0;  /* Register
18810 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66   that is true if
18820 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55   RHS contains NU
18830 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  LL values */.  i
18840 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  nt eType;       
18850 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
18860 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
18870 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20   rLhs;          
18880 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73     /* Register(s
18890 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48  ) holding the LH
188a0 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  S values */.  in
188b0 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20  t rLhsOrig;     
188c0 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65      /* LHS value
188d0 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64  s prior to reord
188e0 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d  ering by aiMap[]
188f0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
18900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18910 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
18920 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
18930 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b   int *aiMap = 0;
18940 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72         /* Map fr
18950 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20  om vector field 
18960 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  to index column 
18970 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20  */.  char *zAff 
18980 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66  = 0;       /* Af
18990 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f  finity string fo
189a0 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f  r comparisons */
189b0 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20  .  int nVector; 
189c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
189d0 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20   of vectors for 
189e0 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72  this IN operator
189f0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79   */.  int iDummy
18a00 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
18a10 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74  ummy parameter t
18a20 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  o exprCodeVector
18a30 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  () */.  Expr *pL
18a40 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eft;          /*
18a50 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   The LHS of the 
18a60 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
18a70 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
18a80 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63         /* loop c
18a90 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
18aa0 64 65 73 74 53 74 65 70 32 3b 20 20 20 20 20 20  destStep2;      
18ab0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75    /* Where to ju
18ac0 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65  mp when NULLs se
18ad0 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a  en in step 2 */.
18ae0 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 36 20    int destStep6 
18af0 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74  = 0;    /* Start
18b00 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65   of code for Ste
18b10 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  p 6 */.  int add
18b20 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f  rTruthOp;      /
18b30 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63  * Address of opc
18b40 6f 64 65 20 74 68 61 74 20 64 65 74 65 72 6d 69  ode that determi
18b50 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20 74 72  nes the IN is tr
18b60 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ue */.  int dest
18b70 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a  NotNull;      /*
18b80 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 20   Jump here if a 
18b90 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f  comparison is no
18ba0 74 20 74 72 75 65 20 69 6e 20 73 74 65 70 20 36  t true in step 6
18bb0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
18bc0 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  p;          /* T
18bd0 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36  op of the step-6
18be0 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65   loop */ ..  pLe
18bf0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
18c00 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  t;.  if( sqlite3
18c10 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72  ExprCheckIN(pPar
18c20 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74  se, pExpr) ) ret
18c30 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78  urn;.  zAff = ex
18c40 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61  prINAffinity(pPa
18c50 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e  rse, pExpr);.  n
18c60 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Vector = sqlite3
18c70 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
18c80 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
18c90 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71  aiMap = (int*)sq
18ca0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
18cb0 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  o(.      pParse-
18cc0 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69  >db, nVector*(si
18cd0 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65  zeof(int) + size
18ce0 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20  of(char)) + 1.  
18cf0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
18d00 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
18d10 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33  d ) goto sqlite3
18d20 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65  ExprCodeIN_oom_e
18d30 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65  rror;..  /* Atte
18d40 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  mpt to compute t
18d50 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68  he RHS. After th
18d60 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74  is step, if anyt
18d70 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a  hing other than.
18d80 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f    ** IN_INDEX_NO
18d90 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OP is returned, 
18da0 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64  the table opened
18db0 20 69 74 68 20 63 75 72 73 6f 72 20 70 45 78 70   ith cursor pExp
18dc0 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20  r->iTable .  ** 
18dd0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
18de0 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  ues that make up
18df0 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f   the RHS. If IN_
18e00 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65  INDEX_NOOP is re
18e10 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65  turned,.  ** the
18e20 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74   RHS has not yet
18e30 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f   been coded.  */
18e40 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
18e50 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
18e60 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
18e70 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72   OOM detected pr
18e80 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ior to this rout
18e90 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ine */.  VdbeNoo
18ea0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
18eb0 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  gin IN expr"));.
18ec0 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
18ed0 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
18ee0 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20  rse, pExpr,.    
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f00 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45           IN_INDE
18f10 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49  X_MEMBERSHIP | I
18f20 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c  N_INDEX_NOOP_OK,
18f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
18f50 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
18f60 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68  fNull ? 0 : &rRh
18f70 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29  sHasNull, aiMap)
18f80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
18f90 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65  rse->nErr || nVe
18fa0 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65  ctor==1 || eType
18fb0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20  ==IN_INDEX_EPH. 
18fc0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
18fd0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
18fe0 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f  SC || eType==IN_
18ff0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
19000 20 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51   .  );.#ifdef SQ
19010 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
19020 43 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69 4d  Confirm that aiM
19030 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56  ap[] contains nV
19040 65 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76 61  ector integer va
19050 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30 20 61  lues between 0 a
19060 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d  nd.  ** nVector-
19070 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  1. */.  for(i=0;
19080 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
19090 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74  {.    int j, cnt
190a0 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d  ;.    for(cnt=j=
190b0 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b  0; j<nVector; j+
190c0 2b 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d  +) if( aiMap[j]=
190d0 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20  =i ) cnt++;.    
190e0 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20 29  assert( cnt==1 )
190f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
19100 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c  /* Code the LHS,
19110 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
19120 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
19130 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69  )". If the LHS i
19140 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72  s a .  ** vector
19150 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f  , then it is sto
19160 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20  red in an array 
19170 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73  of nVector regis
19180 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20  ters starting . 
19190 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a   ** at r1..  **.
191a0 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64    ** sqlite3Find
191b0 49 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74 20  InIndex() might 
191c0 68 61 76 65 20 72 65 6f 72 64 65 72 65 64 20 74  have reordered t
191d0 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  he fields of the
191e0 20 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a   LHS vector.  **
191f0 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 69 65   so that the fie
19200 6c 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73  lds are in the s
19210 61 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e 20  ame order as an 
19220 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e 20  existing index. 
19230 20 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70    The.  ** aiMap
19240 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
19250 73 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d  s a mapping from
19260 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48   the original LH
19270 53 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 6f  S field order to
19280 0a 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64 20  .  ** the field 
19290 6f 72 64 65 72 20 74 68 61 74 20 6d 61 74 63 68  order that match
192a0 65 73 20 74 68 65 20 52 48 53 20 69 6e 64 65 78  es the RHS index
192b0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
192c0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
192d0 61 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72 69  arse);.  rLhsOri
192e0 67 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63 74  g = exprCodeVect
192f0 6f 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  or(pParse, pLeft
19300 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f  , &iDummy);.  fo
19310 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
19320 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b   && aiMap[i]==i;
19330 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c   i++){} /* Are L
19340 48 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64 65  HS fields reorde
19350 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d  red? */.  if( i=
19360 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20 20  =nVector ){.    
19370 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61 72  /* LHS fields ar
19380 65 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64 20  e not reordered 
19390 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72 4c  */.    rLhs = rL
193a0 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b  hsOrig;.  }else{
193b0 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
193c0 72 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53 20  reorder the LHS 
193d0 66 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e 67  fields according
193e0 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20   to aiMap */.   
193f0 20 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 47   rLhs = sqlite3G
19400 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
19410 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20  se, nVector);.  
19420 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
19430 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
19440 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19450 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
19460 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73  rLhsOrig+i, rLhs
19470 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20  +aiMap[i], 0);. 
19480 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
19490 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  f sqlite3FindInI
194a0 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66  ndex() did not f
194b0 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e  ind or create an
194c0 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20   index that is. 
194d0 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72   ** suitable for
194e0 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20   evaluating the 
194f0 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65  IN operator, the
19500 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67  n evaluate using
19510 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65   a.  ** sequence
19520 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e   of comparisons.
19530 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
19540 69 73 20 73 74 65 70 20 28 31 29 20 69 6e 20 74  is step (1) in t
19550 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d  he in-operator.m
19560 64 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f  d optimized algo
19570 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66  rithm..  */.  if
19580 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
19590 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78  X_NOOP ){.    Ex
195a0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
195b0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
195c0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
195d0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
195e0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
195f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
19600 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d     int labelOk =
19610 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19620 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e  Label(v);.    in
19630 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b  t r2, regToFree;
19640 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75  .    int regCkNu
19650 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ll = 0;.    int 
19660 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ii;.    assert( 
19670 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
19680 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
19690 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
196a0 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73   destIfNull!=des
196b0 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
196c0 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71    regCkNull = sq
196d0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
196e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
196f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19700 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72  (v, OP_BitAnd, r
19710 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b  Lhs, rLhs, regCk
19720 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Null);.    }.   
19730 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c   for(ii=0; ii<pL
19740 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  ist->nExpr; ii++
19750 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  ){.      r2 = sq
19760 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
19770 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  p(pParse, pList-
19780 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72  >a[ii].pExpr, &r
19790 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20  egToFree);.     
197a0 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26   if( regCkNull &
197b0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
197c0 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b  BeNull(pList->a[
197d0 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  ii].pExpr) ){.  
197e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
197f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
19800 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c  tAnd, regCkNull,
19810 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r2, regCkNull);
19820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
19830 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  f( ii<pList->nEx
19840 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75  pr-1 || destIfNu
19850 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
19860 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19870 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19880 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62  OP_Eq, rLhs, lab
19890 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20  elOk, r2,.      
198a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198b0 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
198c0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
198d0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
198e0 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73  ageIf(v, ii<pLis
198f0 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
19900 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
19910 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74  eIf(v, ii==pList
19920 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
19930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19940 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b  hangeP5(v, zAff[
19950 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
19960 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
19970 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
19980 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20  stIfFalse );.   
19990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
199a0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
199b0 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c   rLhs, destIfFal
199c0 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20  se, r2,.        
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199e0 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
199f0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62  P4_COLLSEQ); Vdb
19a00 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19a20 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66  eChangeP5(v, zAf
19a30 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55  f[0] | SQLITE_JU
19a40 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
19a50 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
19a60 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
19a70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65  Parse, regToFree
19a80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
19a90 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20   regCkNull ){.  
19aa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19ab0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
19ac0 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64  ll, regCkNull, d
19ad0 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65  estIfNull); Vdbe
19ae0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19af0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
19b00 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  to(v, destIfFals
19b10 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
19b20 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
19b30 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b  Label(v, labelOk
19b40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
19b50 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19b60 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b  rse, regCkNull);
19b70 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65  .    goto sqlite
19b80 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
19b90 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  shed;.  }..  /* 
19ba0 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f  Step 2: Check to
19bb0 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20   see if the LHS 
19bc0 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
19bd0 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74  L columns.  If t
19be0 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73  he.  ** LHS does
19bf0 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74   contain NULLs t
19c00 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hen the result m
19c10 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46 41  ust be either FA
19c20 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a  LSE or NULL..  *
19c30 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73  * We will then s
19c40 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20 73  kip the binary s
19c50 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48 53  earch of the RHS
19c60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  ..  */.  if( des
19c70 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
19c80 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74  alse ){.    dest
19c90 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46 61  Step2 = destIfFa
19ca0 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lse;.  }else{.  
19cb0 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65    destStep2 = de
19cc0 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65  stStep6 = sqlite
19cd0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
19ce0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
19cf0 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
19d00 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
19d10 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
19d20 65 6c 64 53 75 62 65 78 70 72 28 70 45 78 70 72  eldSubexpr(pExpr
19d30 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  ->pLeft, i);.   
19d40 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
19d50 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a  CanBeNull(p) ){.
19d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19d70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
19d80 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65  Null, rLhs+i, de
19d90 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20 20  stStep2);.      
19da0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19db0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19dc0 20 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c 48   Step 3.  The LH
19dd0 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74  S is now known t
19de0 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20  o be non-NULL.  
19df0 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  Do the binary se
19e00 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65  arch.  ** of the
19e10 20 52 48 53 20 75 73 69 6e 67 20 74 68 65 20 4c   RHS using the L
19e20 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20 20  HS as a probe.  
19e30 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72 65  If found, the re
19e40 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72 75  sult is.  ** tru
19e50 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
19e60 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
19e70 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  WID ){.    /* In
19e80 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
19e90 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44  RHS is the ROWID
19ea0 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65   of table b-tree
19eb0 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a   and so we also.
19ec0 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74      ** know that
19ed0 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d   the RHS is non-
19ee0 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65  NULL.  Hence, we
19ef0 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 33   combine steps 3
19f00 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e   and 4.    ** in
19f10 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  to a single opco
19f20 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  de. */.    sqlit
19f30 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19f40 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70 45  OP_SeekRowid, pE
19f50 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
19f60 74 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b  tIfFalse, rLhs);
19f70 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
19f80 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54 72  e(v);.    addrTr
19f90 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56  uthOp = sqlite3V
19fa0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
19fb0 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72  Goto);  /* Retur
19fc0 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73  n True */.  }els
19fd0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
19fe0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
19ff0 66 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e  ffinity, rLhs, n
1a000 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c  Vector, 0, zAff,
1a010 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 69   nVector);.    i
1a020 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d  f( destIfFalse==
1a030 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  destIfNull ){.  
1a040 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53      /* Combine S
1a050 74 65 70 20 33 20 61 6e 64 20 53 74 65 70 20 35  tep 3 and Step 5
1a060 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f   into a single o
1a070 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73  pcode */.      s
1a080 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1a090 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
1a0a0 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
1a0b0 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a  e, destIfFalse,.
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0d0 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c             rLhs,
1a0e0 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43   nVector); VdbeC
1a0f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1a100 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78    goto sqlite3Ex
1a110 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65  prCodeIN_finishe
1a120 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
1a130 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c  Ordinary Step 3,
1a140 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
1a150 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55  ere FALSE and NU
1a160 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  LL are distinct 
1a170 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74 68  */.    addrTruth
1a180 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
1a190 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
1a1a0 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
1a1b0 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  able, 0,.       
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1a1e0 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56  Lhs, nVector); V
1a1f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a200 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34    }..  /* Step 4
1a210 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
1a220 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e   known to be non
1a230 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69 64  -NULL and we did
1a240 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61   not find.  ** a
1a250 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20 73  n match on the s
1a260 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68 65  earch above, the
1a270 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73  n the result mus
1a280 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f  t be FALSE..  */
1a290 0a 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75  .  if( rRhsHasNu
1a2a0 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31  ll && nVector==1
1a2b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a2c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a2d0 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73  NotNull, rRhsHas
1a2e0 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c 73  Null, destIfFals
1a2f0 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  e);.    VdbeCove
1a300 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
1a310 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20 77  /* Step 5.  If w
1a320 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
1a330 6f 75 74 20 74 68 65 20 64 69 66 66 65 72 65 6e  out the differen
1a340 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20  ce between NULL 
1a350 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20  and.  ** FALSE, 
1a360 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
1a370 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20   false. .  */.  
1a380 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d  if( destIfFalse=
1a390 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73 71  =destIfNull ) sq
1a3a0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1a3b0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a   destIfFalse);..
1a3c0 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f    /* Step 6: Loo
1a3d0 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20 6f  p through rows o
1a3e0 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d 70  f the RHS.  Comp
1a3f0 61 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f 20  are each row to 
1a400 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66  the LHS..  ** If
1a410 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20   any comparison 
1a420 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
1a430 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
1a440 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63  .  If all.  ** c
1a450 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20 46  omparisons are F
1a460 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66 69  ALSE then the fi
1a470 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46 41  nal result is FA
1a480 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  LSE..  **.  ** F
1a490 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53 2c  or a scalar LHS,
1a4a0 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e   it is sufficien
1a4b0 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74 20  t to check just 
1a4c0 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20 20  the first row.  
1a4d0 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20  ** of the RHS.. 
1a4e0 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53 74   */.  if( destSt
1a4f0 65 70 36 20 29 20 73 71 6c 69 74 65 33 56 64 62  ep6 ) sqlite3Vdb
1a500 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1a510 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20 61   destStep6);.  a
1a520 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
1a530 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a540 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e  _Rewind, pExpr->
1a550 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
1a560 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  lse);.  VdbeCove
1a570 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e  rage(v);.  if( n
1a580 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Vector>1 ){.    
1a590 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71  destNotNull = sq
1a5a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1a5b0 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  el(v);.  }else{.
1a5c0 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74      /* For nVect
1a5d0 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73  or==1, combine s
1a5e0 74 65 70 73 20 36 20 61 6e 64 20 37 20 62 79 20  teps 6 and 7 by 
1a5f0 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
1a600 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c  rning.    ** FAL
1a610 53 45 20 69 66 20 74 68 65 20 66 69 72 73 74 20  SE if the first 
1a620 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f  comparison is no
1a630 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65  t NULL */.    de
1a640 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74  stNotNull = dest
1a650 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66  IfFalse;.  }.  f
1a660 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
1a670 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
1a680 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  r *p;.    CollSe
1a690 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e  q *pColl;.    in
1a6a0 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65  t r3 = sqlite3Ge
1a6b0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
1a6c0 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
1a6d0 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
1a6e0 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20  xpr(pLeft, i);. 
1a6f0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1a700 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1a710 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71  arse, p);.    sq
1a720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1a730 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45  v, OP_Column, pE
1a740 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c 20  xpr->iTable, i, 
1a750 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r3);.    sqlite3
1a760 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1a770 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73  _Ne, rLhs+i, des
1a780 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20  tNotNull, r3,.  
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
1a7b0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1a7c0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1a7d0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  v);.    sqlite3R
1a7e0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1a7f0 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20  arse, r3);.  }. 
1a800 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a810 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1a820 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
1a830 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29   if( nVector>1 )
1a840 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1a850 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1a860 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20   destNotNull);. 
1a870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a880 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
1a890 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
1a8a0 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20  addrTop+1);.    
1a8b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a8c0 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a  ..    /* Step 7:
1a8d0 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68    If we reach th
1a8e0 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
1a8f0 77 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  w that the resul
1a900 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  t must.    ** be
1a910 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73   false. */.    s
1a920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a930 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1a940 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1a950 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65  }..  /* Jumps he
1a960 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72  re in order to r
1a970 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20  eturn true. */. 
1a980 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1a990 48 65 72 65 28 76 2c 20 61 64 64 72 54 72 75 74  Here(v, addrTrut
1a9a0 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78  hOp);..sqlite3Ex
1a9b0 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65  prCodeIN_finishe
1a9c0 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72  d:.  if( rLhs!=r
1a9d0 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65  LhsOrig ) sqlite
1a9e0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1a9f0 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20  pParse, rLhs);. 
1aa00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1aa10 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1aa20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1aa30 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b  "end IN expr"));
1aa40 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65  .sqlite3ExprCode
1aa50 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20  IN_oom_error:.  
1aa60 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1aa70 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29  arse->db, aiMap)
1aa80 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1aa90 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41  e(pParse->db, zA
1aaa0 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ff);.}.#endif /*
1aab0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1aac0 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  QUERY */..#ifnde
1aad0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1aae0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a  OATING_POINT./*.
1aaf0 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
1ab00 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
1ab10 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f  will put the flo
1ab20 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
1ab30 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62  alue described b
1ab40 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  y z[0..n-1] into
1ab50 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
1ab60 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74  **.** The z[] st
1ab70 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62  ring will probab
1ab80 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74  ly not be zero-t
1ab90 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20  erminated.  But 
1aba0 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61  the .** z[n] cha
1abb0 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e  racter is guaran
1abc0 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74  teed to be somet
1abd0 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e  hing that does n
1abe0 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20  ot look.** like 
1abf0 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
1ac00 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a   of the number..
1ac10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
1ac20 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c  odeReal(Vdbe *v,
1ac30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
1ac40 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20  int negateFlag, 
1ac50 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28  int iMem){.  if(
1ac60 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b   ALWAYS(z!=0) ){
1ac70 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75  .    double valu
1ac80 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74  e;.    sqlite3At
1ac90 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71  oF(z, &value, sq
1aca0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
1acb0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
1acc0 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c      assert( !sql
1acd0 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29  ite3IsNaN(value)
1ace0 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41   ); /* The new A
1acf0 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e  toF never return
1ad00 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28  s NaN */.    if(
1ad10 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61   negateFlag ) va
1ad20 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20  lue = -value;.  
1ad30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ad40 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65  Op4Dup8(v, OP_Re
1ad50 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  al, 0, iMem, 0, 
1ad60 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f  (u8*)&value, P4_
1ad70 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  REAL);.  }.}.#en
1ad80 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  dif.../*.** Gene
1ad90 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
1ada0 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
1adb0 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65  t the integer de
1adc0 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78  scribe by.** tex
1add0 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  t z[0..n-1] into
1ade0 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
1adf0 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f  **.** Expr.u.zTo
1ae00 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54  ken is always UT
1ae10 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d  F8 and zero-term
1ae20 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  inated..*/.stati
1ae30 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67  c void codeInteg
1ae40 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
1ae50 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1ae60 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20  nt negFlag, int 
1ae70 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76  iMem){.  Vdbe *v
1ae80 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1ae90 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
1aea0 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
1aeb0 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  ue ){.    int i 
1aec0 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75  = pExpr->u.iValu
1aed0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  e;.    assert( i
1aee0 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >=0 );.    if( n
1aef0 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b  egFlag ) i = -i;
1af00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1af10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1af20 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a  eger, i, iMem);.
1af30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1af40 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75   c;.    i64 valu
1af50 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1af60 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e  r *z = pExpr->u.
1af70 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65  zToken;.    asse
1af80 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20  rt( z!=0 );.    
1af90 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72  c = sqlite3DecOr
1afa0 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c  HexToI64(z, &val
1afb0 75 65 29 3b 0a 20 20 20 20 69 66 28 20 28 63 3d  ue);.    if( (c=
1afc0 3d 33 20 26 26 20 21 6e 65 67 46 6c 61 67 29 20  =3 && !negFlag) 
1afd0 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e 65  || (c==2) || (ne
1afe0 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d 3d  gFlag && value==
1aff0 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29  SMALLEST_INT64))
1b000 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1b010 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1b020 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65  INT.      sqlite
1b030 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b040 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74  , "oversized int
1b050 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67  eger: %s%s", neg
1b060 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c  Flag ? "-" : "",
1b070 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64   z);.#else.#ifnd
1b080 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48  ef SQLITE_OMIT_H
1b090 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20  EX_INTEGER.     
1b0a0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1b0b0 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d  nicmp(z,"0x",2)=
1b0c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1b0d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b0e0 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72  arse, "hex liter
1b0f0 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25 73  al too big: %s%s
1b100 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22  ", negFlag?"-":"
1b110 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ",z);.      }els
1b120 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
1b130 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
1b140 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c  l(v, z, negFlag,
1b150 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a   iMem);.      }.
1b160 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1b170 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46  {.      if( negF
1b180 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63  lag ){ value = c
1b190 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  ==3 ? SMALLEST_I
1b1a0 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d  NT64 : -value; }
1b1b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b1c0 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
1b1d0 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65  OP_Int64, 0, iMe
1b1e0 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75  m, 0, (u8*)&valu
1b1f0 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1b200 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1b210 20 45 72 61 73 65 20 63 6f 6c 75 6d 6e 2d 63 61   Erase column-ca
1b220 63 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65 72  che entry number
1b230 20 69 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69   i.*/.static voi
1b240 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61  d cacheEntryClea
1b250 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1b260 20 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20 70   int i){.  if( p
1b270 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1b280 5b 69 5d 2e 74 65 6d 70 52 65 67 20 29 7b 0a 20  [i].tempReg ){. 
1b290 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
1b2a0 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
1b2b0 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
1b2c0 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  eg) ){.      pPa
1b2d0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
1b2e0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
1b2f0 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  ] = pParse->aCol
1b300 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20  Cache[i].iReg;. 
1b310 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73     }.  }.  pPars
1b320 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  e->nColCache--;.
1b330 20 20 69 66 28 20 69 3c 70 50 61 72 73 65 2d 3e    if( i<pParse->
1b340 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20  nColCache ){.   
1b350 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
1b360 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e  he[i] = pParse->
1b370 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65  aColCache[pParse
1b380 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20  ->nColCache];.  
1b390 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
1b3a0 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
1b3b0 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
1b3c0 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
1b3d0 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
1b3e0 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
1b3f0 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
1b400 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
1b410 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1b420 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
1b430 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1b440 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
1b450 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
1b460 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
1b470 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
1b480 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1b490 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  he *p;..  /* Unl
1b4a0 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73  ess an error has
1b4b0 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73   occurred, regis
1b4c0 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  ter numbers are 
1b4d0 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e  always positive.
1b4e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52   */.  assert( iR
1b4f0 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  eg>0 || pParse->
1b500 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
1b510 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1b520 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   );.  assert( iC
1b530 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33  ol>=-1 && iCol<3
1b540 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69  2768 );  /* Fini
1b550 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  te column number
1b560 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53  s */..  /* The S
1b570 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
1b580 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20  e flag disables 
1b590 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1b5a0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  .  This is used.
1b5b0 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67    ** for testing
1b5c0 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66   only - to verif
1b5d0 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c  y that SQLite al
1b5e0 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61  ways gets the sa
1b5f0 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77  me answer.  ** w
1b600 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20  ith and without 
1b610 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1b620 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..  */.  if( Opt
1b630 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
1b640 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
1b650 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
1b660 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
1b670 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20  * First replace 
1b680 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74  any existing ent
1b690 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ry..  **.  ** Ac
1b6a0 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20  tually, the way 
1b6b0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1b6c0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73   is currently us
1b6d0 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61  ed, we are guara
1b6e0 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20  nteed.  ** that 
1b6f0 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  the object will 
1b700 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65  never already be
1b710 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69   in cache.  Veri
1b720 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  fy this guarante
1b730 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  e..  */.#ifndef 
1b740 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  NDEBUG.  for(i=0
1b750 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1b760 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d  Cache; i<pParse-
1b770 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c  >nColCache; i++,
1b780 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   p++){.    asser
1b790 74 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54  t( p->iTable!=iT
1b7a0 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e  ab || p->iColumn
1b7b0 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65  !=iCol );.  }.#e
1b7c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1b7d0 65 20 63 61 63 68 65 20 69 73 20 61 6c 72 65 61  e cache is alrea
1b7e0 64 79 20 66 75 6c 6c 2c 20 64 65 6c 65 74 65 20  dy full, delete 
1b7f0 74 68 65 20 6c 65 61 73 74 20 72 65 63 65 6e 74  the least recent
1b800 6c 79 20 75 73 65 64 20 65 6e 74 72 79 20 2a 2f  ly used entry */
1b810 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1b820 43 6f 6c 43 61 63 68 65 3e 3d 53 51 4c 49 54 45  ColCache>=SQLITE
1b830 5f 4e 5f 43 4f 4c 43 41 43 48 45 20 29 7b 0a 20  _N_COLCACHE ){. 
1b840 20 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66     minLru = 0x7f
1b850 66 66 66 66 66 66 3b 0a 20 20 20 20 69 64 78 4c  ffffff;.    idxL
1b860 72 75 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72  ru = -1;.    for
1b870 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1b880 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
1b890 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
1b8a0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20  i++, p++){.     
1b8b0 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c   if( p->lru<minL
1b8c0 72 75 20 29 7b 0a 20 20 20 20 20 20 20 20 69 64  ru ){.        id
1b8d0 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20  xLru = i;.      
1b8e0 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72    minLru = p->lr
1b8f0 75 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  u;.      }.    }
1b900 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65  .    p = &pParse
1b910 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c  ->aColCache[idxL
1b920 72 75 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ru];.  }else{.  
1b930 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
1b940 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65 2d  ColCache[pParse-
1b950 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20  >nColCache++];. 
1b960 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
1b970 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68   new entry to th
1b980 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63  e end of the cac
1b990 68 65 20 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76 65  he */.  p->iLeve
1b9a0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
1b9b0 68 65 4c 65 76 65 6c 3b 0a 20 20 70 2d 3e 69 54  heLevel;.  p->iT
1b9c0 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 70  able = iTab;.  p
1b9d0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
1b9e0 3b 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52  ;.  p->iReg = iR
1b9f0 65 67 3b 0a 20 20 70 2d 3e 74 65 6d 70 52 65 67  eg;.  p->tempReg
1ba00 20 3d 20 30 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d   = 0;.  p->lru =
1ba10 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
1ba20 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  nt++;.}../*.** I
1ba30 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65 67  ndicate that reg
1ba40 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20 69  isters between i
1ba50 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31  Reg..iReg+nReg-1
1ba60 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77   are being overw
1ba70 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65  ritten..** Purge
1ba80 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65   the range of re
1ba90 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65  gisters from the
1baa0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
1bab0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1bac0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61  prCacheRemove(Pa
1bad0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1bae0 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
1baf0 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
1bb00 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73 65   while( i<pParse
1bb10 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20  ->nColCache ){. 
1bb20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
1bb30 63 68 65 20 2a 70 20 3d 20 26 70 50 61 72 73 65  che *p = &pParse
1bb40 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a  ->aColCache[i];.
1bb50 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
1bb60 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52  >= iReg && p->iR
1bb70 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29  eg < iReg+nReg )
1bb80 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
1bb90 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
1bba0 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
1bbb0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a       i++;.    }.
1bbc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
1bbd0 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65 6e  ember the curren
1bbe0 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63  t column cache c
1bbf0 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77  ontext.  Any new
1bc00 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a   entries added.*
1bc10 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  * added to the c
1bc20 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65  olumn cache afte
1bc30 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20  r this call are 
1bc40 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65  removed when the
1bc50 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
1bc60 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f  g pop occurs..*/
1bc70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1bc80 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73 65  rCachePush(Parse
1bc90 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
1bca0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1bcb0 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ++;.#ifdef SQLIT
1bcc0 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
1bcd0 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
1bce0 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
1bcf0 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70  opTrace ){.    p
1bd00 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20 25  rintf("PUSH to %
1bd10 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43  d\n", pParse->iC
1bd20 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a  acheLevel);.  }.
1bd30 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
1bd40 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20  Remove from the 
1bd50 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79  column cache any
1bd60 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 65   entries that we
1bd70 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20 74  re added since t
1bd80 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f  he.** the previo
1bd90 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  us sqlite3ExprCa
1bda0 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69 6f  chePush operatio
1bdb0 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  n.  In other wor
1bdc0 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74  ds, restore.** t
1bdd0 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65 20  he cache to the 
1bde0 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1bdf0 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  prior the most r
1be00 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76  ecent Push..*/.v
1be10 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1be20 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70  achePop(Parse *p
1be30 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 20  Parse){.  int i 
1be40 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
1be50 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1be60 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73  el>=1 );.  pPars
1be70 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d  e->iCacheLevel--
1be80 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1be90 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72  DEBUG.  if( pPar
1bea0 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
1beb0 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
1bec0 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  Trace ){.    pri
1bed0 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c  ntf("POP  to %d\
1bee0 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63  n", pParse->iCac
1bef0 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65  heLevel);.  }.#e
1bf00 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 20 69 3c  ndif.  while( i<
1bf10 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1bf20 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  e ){.    if( pPa
1bf30 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1bf40 5d 2e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d  ].iLevel>pParse-
1bf50 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a  >iCacheLevel ){.
1bf60 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
1bf70 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69 29  Clear(pParse, i)
1bf80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bf90 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     i++;.    }.  
1bfa0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  }.}../*.** When 
1bfb0 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20  a cached column 
1bfc0 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20  is reused, make 
1bfd0 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65  sure that its re
1bfe0 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20  gister is.** no 
1bff0 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65  longer available
1c000 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73   as a temp regis
1c010 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38  ter.  ticket #38
1c020 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a  79:  that same.*
1c030 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74  * register might
1c040 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
1c050 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
1c060 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20  ces, so be sure 
1c070 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61  to.** get them a
1c080 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
1c090 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1c0a0 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50  chePinRegister(P
1c0b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1c0c0 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
1c0d0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
1c0e0 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
1c0f0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1c100 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
1c110 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
1c120 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
1c130 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
1c140 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  {.      p->tempR
1c150 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
1c160 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  }.}../* Generate
1c170 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1c180 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73 74  load into regist
1c190 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c 75  er regOut a valu
1c1a0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70  e that is.** app
1c1b0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
1c1c0 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75   iIdxCol-th colu
1c1d0 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  mn of index pIdx
1c1e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c1f0 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64  3ExprCodeLoadInd
1c200 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  exColumn(.  Pars
1c210 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20 54  e *pParse,  /* T
1c220 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1c230 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
1c240 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20 69  Idx,    /* The i
1c250 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d  ndex whose colum
1c260 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64 65  n is to be loade
1c270 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  d */.  int iTabC
1c280 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ur,    /* Cursor
1c290 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74   pointing to a t
1c2a0 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  able row */.  in
1c2b0 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a  t iIdxCol,    /*
1c2c0 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   The column of t
1c2d0 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 6c  he index to be l
1c2e0 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  oaded */.  int r
1c2f0 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53 74  egOut      /* St
1c300 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f  ore the index co
1c310 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68  lumn value in th
1c320 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
1c330 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c 20  {.  i16 iTabCol 
1c340 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
1c350 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28  [iIdxCol];.  if(
1c360 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50   iTabCol==XN_EXP
1c370 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
1c380 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
1c390 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1c3a0 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e  Idx->aColExpr->n
1c3b0 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a  Expr>iIdxCol );.
1c3c0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
1c3d0 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 20 2b  fTab = iTabCur +
1c3e0 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   1;.    sqlite3E
1c3f0 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72  xprCodeCopy(pPar
1c400 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  se, pIdx->aColEx
1c410 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70  pr->a[iIdxCol].p
1c420 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  Expr, regOut);. 
1c430 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
1c440 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Tab = 0;.  }else
1c450 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1c460 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
1c470 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56  Table(pParse->pV
1c480 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c  dbe, pIdx->pTabl
1c490 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20  e, iTabCur,.    
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4c0 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29  iTabCol, regOut)
1c4d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
1c4e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1c4f0 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  extract the valu
1c500 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  e of the iCol-th
1c510 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
1c520 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
1c530 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1c540 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56  lumnOfTable(.  V
1c550 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f  dbe *v,        /
1c560 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
1c570 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1c580 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
1c590 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
1c5a0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
1c5b0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  alue */.  int iT
1c5c0 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65  abCur,    /* The
1c5d0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20   table cursor.  
1c5e0 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72  Or the PK cursor
1c5f0 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
1c600 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ID */.  int iCol
1c610 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ,       /* Index
1c620 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74   of the column t
1c630 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69  o extract */.  i
1c640 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f  nt regOut      /
1c650 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
1c660 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65  lue into this re
1c670 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  gister */.){.  i
1c680 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
1c690 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c6a0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1c6b0 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c  , iTabCur, iCol,
1c6c0 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 72 65   regOut);.    re
1c6d0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
1c6e0 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d  iCol<0 || iCol==
1c6f0 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
1c700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c710 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
1c720 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75  , iTabCur, regOu
1c730 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
1c740 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74   int op = IsVirt
1c750 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56  ual(pTab) ? OP_V
1c760 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75  Column : OP_Colu
1c770 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  mn;.    int x = 
1c780 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48  iCol;.    if( !H
1c790 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26  asRowid(pTab) &&
1c7a0 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
1c7b0 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73  ) ){.      x = s
1c7c0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1c7d0 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61  dex(sqlite3Prima
1c7e0 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
1c7f0 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , iCol);.    }. 
1c800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c810 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62  dOp3(v, op, iTab
1c820 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b  Cur, x, regOut);
1c830 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
1c840 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1c850 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76  3ColumnDefault(v
1c860 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65  , pTab, iCol, re
1c870 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
1c880 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1c890 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  e that will extr
1c8a0 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  act the iColumn-
1c8b0 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  th column from.*
1c8c0 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  * table pTab and
1c8d0 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
1c8e0 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67  n value in a reg
1c8f0 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e  ister. .**.** An
1c900 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
1c910 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  to store the col
1c920 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67  umn value in reg
1c930 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 69  ister iReg.  Thi
1c940 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72 61  s.** is not gara
1c950 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74 43 6f  nteeed for GetCo
1c960 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65 73  lumn() - the res
1c970 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65  ult can be store
1c980 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69  d in.** any regi
1c990 73 74 65 72 2e 20 20 42 75 74 20 74 68 65 20 72  ster.  But the r
1c9a0 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74  esult is guarant
1c9b0 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72  eed to land in r
1c9c0 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a 20  egister iReg.** 
1c9d0 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52  for GetColumnToR
1c9e0 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  eg()..**.** Ther
1c9f0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
1ca00 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
1ca10 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
1ca20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1ca30 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
1ca40 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
1ca50 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
1ca60 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
1ca70 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20  e rowid..*/.int 
1ca80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1ca90 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
1caa0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
1cab0 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
1cac0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
1cad0 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
1cae0 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
1caf0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1cb00 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
1cb10 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
1cb20 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
1cb30 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1cb40 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
1cb50 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1cb60 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1cb70 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1cb80 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1cb90 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
1cba0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
1cbb0 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20  re */.  u8 p5   
1cbc0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76           /* P5 v
1cbd0 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75  alue for OP_Colu
1cbe0 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b  mn + FLAGS */.){
1cbf0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1cc00 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1cc10 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
1cc20 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
1cc30 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1cc40 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70  ->aColCache; i<p
1cc50 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1cc60 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1cc70 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d 3d   if( p->iTable==
1cc80 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f  iTable && p->iCo
1cc90 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn==iColumn ){
1cca0 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
1ccb0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
1ccc0 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
1ccd0 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65  e3ExprCachePinRe
1cce0 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70  gister(pParse, p
1ccf0 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72  ->iReg);.      r
1cd00 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20  eturn p->iReg;. 
1cd10 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73     }.  }  .  ass
1cd20 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
1cd30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1cd40 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
1cd50 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20  , pTab, iTable, 
1cd60 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
1cd70 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20    if( p5 ){.    
1cd80 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1cd90 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65  eP5(v, p5);.  }e
1cda0 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69  lse{   .    sqli
1cdb0 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1cdc0 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65  e(pParse, iTable
1cdd0 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
1cde0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1cdf0 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  Reg;.}.void sqli
1ce00 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1ce10 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61 72  lumnToReg(.  Par
1ce20 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
1ce30 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1ce40 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1ce50 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1ce60 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
1ce70 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1ce80 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
1ce90 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
1cea0 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
1ceb0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1cec0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
1ced0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1cee0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1cef0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
1cf00 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1cf10 20 69 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a   iReg         /*
1cf20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
1cf30 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1cf40 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1cf50 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
1cf60 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c  arse, pTab, iCol
1cf70 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52 65  umn, iTable, iRe
1cf80 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31 21  g, 0);.  if( r1!
1cf90 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65 33 56  =iReg ) sqlite3V
1cfa0 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
1cfb0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
1cfc0 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a  y, r1, iReg);.}.
1cfd0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c  ../*.** Clear al
1cfe0 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65  l column cache e
1cff0 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ntries..*/.void 
1d000 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1d010 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61  Clear(Parse *pPa
1d020 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  rse){.  int i;..
1d030 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1d040 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
1d050 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1d060 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1d070 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
1d080 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20  f("CLEAR\n");.  
1d090 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  }.#endif.  for(i
1d0a0 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  =0; i<pParse->nC
1d0b0 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20  olCache; i++){. 
1d0c0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
1d0d0 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70  ColCache[i].temp
1d0e0 52 65 67 0a 20 20 20 20 20 26 26 20 70 50 61 72  Reg.     && pPar
1d0f0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
1d100 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
1d110 54 65 6d 70 52 65 67 29 0a 20 20 20 20 29 7b 0a  TempReg).    ){.
1d120 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
1d130 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
1d140 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50  nTempReg++] = pP
1d150 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1d160 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  i].iReg;.    }. 
1d170 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f   }.  pParse->nCo
1d180 6c 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  lCache = 0;.}../
1d190 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20  *.** Record the 
1d1a0 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66 66  fact that an aff
1d1b0 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73  inity change has
1d1c0 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f   occurred on iCo
1d1d0 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  unt.** registers
1d1e0 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69   starting with i
1d1f0 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Start..*/.void s
1d200 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1d210 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61  ffinityChange(Pa
1d220 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1d230 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f   iStart, int iCo
1d240 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45  unt){.  sqlite3E
1d250 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1d260 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69  Parse, iStart, i
1d270 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Count);.}../*.**
1d280 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1d290 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66  o move content f
1d2a0 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46  rom registers iF
1d2b0 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67  rom...iFrom+nReg
1d2c0 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54  -1.** over to iT
1d2d0 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b  o..iTo+nReg-1. K
1d2e0 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  eep the column c
1d2f0 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e  ache up-to-date.
1d300 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d310 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72  ExprCodeMove(Par
1d320 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1d330 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20  iFrom, int iTo, 
1d340 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73  int nReg){.  ass
1d350 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b  ert( iFrom>=iTo+
1d360 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52  nReg || iFrom+nR
1d370 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c  eg<=iTo );.  sql
1d380 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1d390 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1d3a0 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54  _Move, iFrom, iT
1d3b0 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69  o, nReg);.  sqli
1d3c0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
1d3d0 76 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f 6d  ve(pParse, iFrom
1d3e0 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20  , nReg);.}..#if 
1d3f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1d400 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1d410 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45  (SQLITE_COVERAGE
1d420 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
1d430 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
1d440 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
1d450 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f  range iFrom..iTo
1d460 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20   (inclusive).** 
1d470 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
1d480 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  of the column ca
1d490 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
1d4a0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1d4b0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1d4c0 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d  and testcase() m
1d4d0 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e  acros only.** an
1d4e0 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  d does not appea
1d4f0 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75  r in a normal bu
1d500 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ild..*/.static i
1d510 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  nt usedAsColumnC
1d520 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
1d530 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
1d540 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69  nt iTo){.  int i
1d550 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
1d560 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
1d570 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1d580 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
1d590 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
1d5a0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
1d5b0 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   r = p->iReg;.  
1d5c0 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26    if( r>=iFrom &
1d5d0 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72  & r<=iTo ) retur
1d5e0 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53  n 1;    /*NO_TES
1d5f0 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  T*/.  }.  return
1d600 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1d610 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20  SQLITE_DEBUG || 
1d620 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
1d630 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  TEST */.../*.** 
1d640 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61 72  Convert a scalar
1d650 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
1d660 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45   to a TK_REGISTE
1d670 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a  R referencing.**
1d680 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20   register iReg. 
1d690 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
1d6a0 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 52 65   ensure that iRe
1d6b0 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  g already contai
1d6c0 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ns.** the correc
1d6d0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
1d6e0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73  expression..*/.s
1d6f0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 54  tatic void exprT
1d700 6f 52 65 67 69 73 74 65 72 28 45 78 70 72 20 2a  oRegister(Expr *
1d710 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  p, int iReg){.  
1d720 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a  p->op2 = p->op;.
1d730 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47    p->op = TK_REG
1d740 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62  ISTER;.  p->iTab
1d750 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70  le = iReg;.  Exp
1d760 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70  rClearProperty(p
1d770 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f  , EP_Skip);.}../
1d780 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 6e  *.** Evaluate an
1d790 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69 74   expression (eit
1d7a0 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20  her a vector or 
1d7b0 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
1d7c0 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a  ion) and store.*
1d7d0 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  * the result in 
1d7e0 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d 70  continguous temp
1d7f0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 2e  orary registers.
1d800 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
1d810 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72  ex of.** the fir
1d820 73 74 20 72 65 67 69 73 74 65 72 20 75 73 65 64  st register used
1d830 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
1d840 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sult..**.** If t
1d850 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75  he returned resu
1d860 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 61  lt register is a
1d870 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c 61   temporary scala
1d880 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69  r, then also wri
1d890 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69 73  te.** that regis
1d8a0 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  ter number into 
1d8b0 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49 66  *piFreeable.  If
1d8c0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65   the returned re
1d8d0 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a 2a  sult register.**
1d8e0 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
1d8f0 61 72 79 20 6f 72 20 69 66 20 74 68 65 20 65 78  ary or if the ex
1d900 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 65  pression is a ve
1d910 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65 65  ctor set *piFree
1d920 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f  able.** to 0..*/
1d930 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
1d940 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73 65  CodeVector(Parse
1d950 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1d960 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61 62  p, int *piFreeab
1d970 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73 75  le){.  int iResu
1d980 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c  lt;.  int nResul
1d990 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  t = sqlite3ExprV
1d9a0 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20  ectorSize(p);.  
1d9b0 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29  if( nResult==1 )
1d9c0 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20  {.    iResult = 
1d9d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1d9e0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  emp(pParse, p, p
1d9f0 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65  iFreeable);.  }e
1da00 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65 65  lse{.    *piFree
1da10 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  able = 0;.    if
1da20 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ( p->op==TK_SELE
1da30 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  CT ){.#if SQLITE
1da40 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1da50 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 30       iResult = 0
1da60 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 52  ;.#else.      iR
1da70 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 43  esult = sqlite3C
1da80 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
1da90 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 23  rse, p, 0, 0);.#
1daa0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
1dab0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1dac0 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70 50      iResult = pP
1dad0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
1dae0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1daf0 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20   += nResult;.   
1db00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
1db10 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  esult; i++){.   
1db20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1db30 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70  CodeFactorable(p
1db40 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73  Parse, p->x.pLis
1db50 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
1db60 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  +iResult);.     
1db70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1db80 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d  eturn iResult;.}
1db90 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1dba0 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
1dbb0 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
1dbc0 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
1dbd0 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
1dbe0 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  .  Attempt to st
1dbf0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1dc00 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72  in register "tar
1dc10 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  get"..** Return 
1dc20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  the register whe
1dc30 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  re results are s
1dc40 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  tored..**.** Wit
1dc50 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  h this routine, 
1dc60 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72  there is no guar
1dc70 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c  antee that resul
1dc80 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74  ts will.** be st
1dc90 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20  ored in target. 
1dca0 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68   The result migh
1dcb0 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73  t be stored in s
1dcc0 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67  ome other.** reg
1dcd0 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63  ister if it is c
1dce0 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20  onvenient to do 
1dcf0 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  so.  The calling
1dd00 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
1dd10 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
1dd20 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65  rn code and move
1dd30 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
1dd40 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72  the desired.** r
1dd50 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
1dd60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1dd70 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61  arget(Parse *pPa
1dd80 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1dd90 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1dda0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1ddb0 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68  e->pVdbe;  /* Th
1ddc0 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e VM under const
1ddd0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
1dde0 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1ddf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
1de00 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
1de10 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20   */.  int inReg 
1de20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20  = target;       
1de30 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65  /* Results store
1de40 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e  d in register in
1de50 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  Reg */.  int reg
1de60 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20  Free1 = 0;      
1de70 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
1de80 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
1de90 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
1dea0 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  /.  int regFree2
1deb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1dec0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
1ded0 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
1dee0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
1def0 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20 20  nt r1, r2;      
1df00 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69           /* Vari
1df10 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ous register num
1df20 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 74  bers */.  Expr t
1df30 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  empX;           
1df40 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
1df50 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
1df60 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20 30   */.  int p5 = 0
1df70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
1df80 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
1df90 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
1dfa0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
1dfb0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1dfc0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1dfd0 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
1dfe0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  n 0;.  }..  if( 
1dff0 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
1e000 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1e010 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
1e020 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20  pExpr->op;.  }. 
1e030 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1e040 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
1e050 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41  OLUMN: {.      A
1e060 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1e070 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
1e080 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
1e090 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
1e0a0 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
1e0b0 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67  aCol[pExpr->iAgg
1e0c0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  ];.      if( !pA
1e0d0 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
1e0e0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  de ){.        as
1e0f0 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d  sert( pCol->iMem
1e100 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  >0 );.        re
1e110 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b  turn pCol->iMem;
1e120 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e130 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f   pAggInfo->useSo
1e140 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20  rtingIdx ){.    
1e150 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e160 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1e170 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f  mn, pAggInfo->so
1e180 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20  rtingIdxPTab,.  
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1e1b0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
1e1c0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e1d0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e1e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
1e1f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  * Otherwise, fal
1e200 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
1e210 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a  TK_COLUMN case *
1e220 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
1e230 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
1e240 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70      int iTab = p
1e250 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
1e260 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20 29      if( iTab<0 )
1e270 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
1e280 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c 30  arse->iSelfTab<0
1e290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1e2a0 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43   Generating CHEC
1e2b0 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72  K constraints or
1e2c0 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20   inserting into 
1e2d0 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f  partial index */
1e2e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1e2f0 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  n pExpr->iColumn
1e300 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66   - pParse->iSelf
1e310 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  Tab;.        }el
1e320 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1e330 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72 65   Coding an expre
1e340 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61  ssion that is pa
1e350 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 77  rt of an index w
1e360 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  here column name
1e370 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
1e380 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66 65  n the index refe
1e390 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74  r to the table t
1e3a0 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65  o which the inde
1e3b0 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20  x belongs */.   
1e3c0 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50         iTab = pP
1e3d0 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 2d  arse->iSelfTab -
1e3e0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
1e3f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1e400 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
1e410 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
1e420 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
1e430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e450 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
1e460 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20  iTab, target,.  
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1e490 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a  pr->op2);.    }.
1e4a0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
1e4b0 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  GER: {.      cod
1e4c0 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
1e4d0 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65   pExpr, 0, targe
1e4e0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1e4f0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1e500 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e510 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1e520 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
1e530 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
1e540 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e550 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e560 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1e570 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
1e580 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1e590 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1e5a0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e5b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1e5c0 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
1e5d0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1e5e0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e5f0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1e600 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e610 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
1e620 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
1e630 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e640 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e650 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
1e660 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
1e670 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1e680 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e690 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
1e6a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1e6b0 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66  arget;.    }.#if
1e6c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e6d0 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
1e6e0 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
1e6f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
1e700 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1e710 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  *z;.      char *
1e720 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73  zBlob;.      ass
1e730 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e740 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e750 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1e760 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e770 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1e780 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a  x' || pExpr->u.z
1e790 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b  Token[0]=='X' );
1e7a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e7b0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1e7c0 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
1e7d0 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a   z = &pExpr->u.z
1e7e0 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20  Token[2];.      
1e7f0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
1e800 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20  n30(z) - 1;.    
1e810 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d    assert( z[n]==
1e820 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42  '\'' );.      zB
1e830 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
1e840 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
1e850 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
1e860 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e870 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
1e880 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
1e890 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
1e8a0 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65  NAMIC);.      re
1e8b0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e8c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
1e8d0 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
1e8e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e8f0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1e900 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1e910 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1e920 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1e930 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20  Token!=0 );.    
1e940 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e950 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20  >u.zToken[0]!=0 
1e960 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e970 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e980 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
1e990 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
1e9a0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  t);.      if( pE
1e9b0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
1e9c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  !=0 ){.        c
1e9d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
1e9e0 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f  qlite3VListNumTo
1e9f0 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c  Name(pParse->pVL
1ea00 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ist, pExpr->iCol
1ea10 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73  umn);.        as
1ea20 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1ea30 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c  Token[0]=='?' ||
1ea40 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
1ea50 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29  .zToken, z)==0 )
1ea60 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
1ea70 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b  ->pVList[0] = 0;
1ea80 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c 69   /* Indicate VLi
1ea90 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72  st may no longer
1eaa0 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1eab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1eac0 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
1ead0 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54  char*)z, P4_STAT
1eae0 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
1eaf0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1eb00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1eb10 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
1eb20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
1eb30 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
1eb40 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1eb50 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
1eb60 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
1eb70 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
1eb80 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
1eb90 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
1eba0 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
1ebb0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1ebc0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1ebd0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1ebe0 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
1ebf0 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
1ec00 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20  arget ){.       
1ec10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ec20 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
1ec30 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
1ec40 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
1ec50 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
1ec60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ec70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61  eAddOp2(v, OP_Ca
1ec80 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  st, target,.    
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e      sqlite3Affin
1ecb0 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75  ityType(pExpr->u
1ecc0 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20  .zToken, 0));.  
1ecd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73      testcase( us
1ece0 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
1ecf0 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69  pParse, inReg, i
1ed00 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73  nReg) );.      s
1ed10 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1ed20 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1ed30 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b  arse, inReg, 1);
1ed40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e  .      return in
1ed50 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  Reg;.    }.#endi
1ed60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1ed70 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
1ed80 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
1ed90 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
1eda0 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
1edb0 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
1edc0 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53  NE;.      p5 = S
1edd0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
1ede0 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f      /* fall-thro
1edf0 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
1ee00 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1ee10 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1ee20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1ee30 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1ee40 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1ee50 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45  TK_EQ: {.      E
1ee60 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1ee70 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1ee80 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1ee90 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20  IsVector(pLeft) 
1eea0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56  ){.        codeV
1eeb0 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61  ectorCompare(pPa
1eec0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1eed0 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20  et, op, p5);.   
1eee0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1eef0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1ef00 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1ef10 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72  e, pLeft, &regFr
1ef20 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
1ef30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1ef40 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1ef50 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1ef60 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1ef70 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1ef80 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78  arse, pLeft, pEx
1ef90 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1efb0 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
1efc0 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b  E_STOREP2 | p5);
1efd0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1efe0 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
1eff0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1f000 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1f010 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
1f020 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f030 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
1f040 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1f050 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1f060 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
1f070 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f080 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
1f090 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1f0a0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1f0b0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
1f0c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f0d0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
1f0e0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1f0f0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1f100 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
1f110 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f120 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
1f130 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
1f140 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
1f150 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
1f160 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f170 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
1f180 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
1f190 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1f1a0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
1f1b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1f1c0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f1d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1f1e0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1f1f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f200 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f210 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
1f220 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
1f230 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
1f240 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
1f250 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
1f260 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
1f270 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
1f280 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
1f290 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
1f2a0 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
1f2b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
1f2c0 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
1f2d0 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
1f2e0 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
1f2f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f300 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20  _AND==OP_And ); 
1f310 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1f320 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ase( op==TK_AND 
1f330 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f340 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
1f350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1f360 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f  stcase( op==TK_O
1f370 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
1f380 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
1f390 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  dd );           
1f3a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f3b0 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61  _PLUS );.      a
1f3c0 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
1f3d0 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20  =OP_Subtract ); 
1f3e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f3f0 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
1f400 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
1f410 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
1f420 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1f430 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
1f440 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f450 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
1f460 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74  And );      test
1f470 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1f480 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
1f490 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
1f4a0 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20  P_BitOr );      
1f4b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f4c0 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20  TK_BITOR );.    
1f4d0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
1f4e0 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
1f4f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f500 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b   op==TK_SLASH );
1f510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f520 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
1f530 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74  ftLeft );   test
1f540 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48  case( op==TK_LSH
1f550 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
1f560 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
1f570 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
1f580 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f590 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
1f5a0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
1f5b0 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
1f5c0 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1f5d0 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
1f5e0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1f5f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f600 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f610 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1f620 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1f630 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f640 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f650 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1f660 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
1f670 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1f680 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
1f690 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
1f6a0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f6b0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1f6c0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1f6d0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1f6e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f6f0 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
1f700 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
1f710 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1f720 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
1f730 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
1f740 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
1f750 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
1f760 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
1f770 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74  rse, pLeft, 1, t
1f780 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1f790 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23  return target;.#
1f7a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f7b0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1f7c0 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  T.      }else if
1f7d0 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
1f7e0 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
1f7f0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1f800 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1f810 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1f820 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
1f830 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54  l(v, pLeft->u.zT
1f840 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29  oken, 1, target)
1f850 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f860 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a   target;.#endif.
1f870 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f880 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20       tempX.op = 
1f890 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TK_INTEGER;.    
1f8a0 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20      tempX.flags 
1f8b0 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  = EP_IntValue|EP
1f8c0 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20  _TokenOnly;.    
1f8d0 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c      tempX.u.iVal
1f8e0 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ue = 0;.        
1f8f0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f900 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f910 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65   &tempX, &regFre
1f920 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  e1);.        r2 
1f930 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f940 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f950 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1f960 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
1f970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f980 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74  3(v, OP_Subtract
1f990 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
1f9a0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f9b0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1f9c0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1f9d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f9e0 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
1f9f0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
1fa00 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
1fa10 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
1fa20 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65  P_BitNot );   te
1fa30 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1fa40 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61  ITNOT );.      a
1fa50 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f  ssert( TK_NOT==O
1fa60 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20  P_Not );        
1fa70 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fa80 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  K_NOT );.      r
1fa90 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1faa0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1fab0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1fac0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1fad0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1fae0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  e1==0 );.      s
1faf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1fb00 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65  (v, op, r1, inRe
1fb10 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
1fb20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1fb30 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
1fb40 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
1fb50 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
1fb60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fb70 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
1fb80 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
1fb90 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
1fba0 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
1fbb0 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
1fbc0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
1fbd0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1fbe0 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  TNULL );.      s
1fbf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1fc00 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1fc10 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1fc20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1fc30 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fc40 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1fc50 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1fc60 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1fc70 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1fc80 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
1fc90 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70  VdbeAddOp1(v, op
1fca0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
1fcb0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1fcc0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
1fcd0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1fce0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
1fcf0 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  TNULL);.      sq
1fd00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1fd10 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1fd20 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1fd30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1fd40 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
1fd50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fd60 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
1fd70 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
1fd80 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
1fd90 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
1fda0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
1fdb0 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
1fdc0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1fdd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1fde0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1fdf0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1fe00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1fe10 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
1fe20 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c  ggregate: %s()",
1fe30 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1fe40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1fe50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1fe60 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
1fe70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
1fe80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1fe90 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fea0 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
1feb0 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
1fec0 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
1fed0 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
1fee0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1fef0 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b        int nFarg;
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff10 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69  Number of functi
1ff20 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1ff30 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
1ff40 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Def;         /* 
1ff50 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  The function def
1ff60 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  inition object *
1ff70 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
1ff80 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f  ar *zId;       /
1ff90 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
1ffa0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  ame */.      u32
1ffb0 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20   constMask = 0; 
1ffc0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66      /* Mask of f
1ffd0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1ffe0 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74  s that are const
1fff0 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ant */.      int
20000 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
20010 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
20020 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ter */.      sql
20030 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
20040 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
20050 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
20060 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65  on */.      u8 e
20070 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20  nc = ENC(db);   
20080 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
20090 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20  ncoding used by 
200a0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
200b0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
200c0 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a  pColl = 0;    /*
200d0 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   A collating seq
200e0 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20  uence */..      
200f0 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  if( ConstFactorO
20100 6b 28 70 50 61 72 73 65 29 20 26 26 20 73 71 6c  k(pParse) && sql
20110 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
20120 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29  ntNotJoin(pExpr)
20130 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
20140 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  QL functions can
20150 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20 53   be expensive. S
20160 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f  o try to move co
20170 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73  nstant functions
20180 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 20  .        ** out 
20190 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
201a0 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  p, even if that 
201b0 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20 4f  means an extra O
201c0 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20  P_Copy. */.     
201d0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
201e0 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
201f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d  pParse, pExpr, -
20200 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
20210 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
20220 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
20230 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
20240 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
20250 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20260 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
20270 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61  ) ){.        pFa
20280 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rg = 0;.      }e
20290 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61  lse{.        pFa
202a0 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  rg = pExpr->x.pL
202b0 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
202c0 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67     nFarg = pFarg
202d0 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20   ? pFarg->nExpr 
202e0 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  : 0;.      asser
202f0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
20300 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
20310 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
20320 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e   zId = pExpr->u.
20330 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44  zToken;.      pD
20340 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
20350 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64  Function(db, zId
20360 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
20370 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
20380 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53  ENABLE_UNKNOWN_S
20390 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20  QL_FUNCTION.    
203a0 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26    if( pDef==0 &&
203b0 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
203c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
203d0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
203e0 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e  nction(db, "unkn
203f0 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63  own", nFarg, enc
20400 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
20410 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
20420 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e  Def==0 || pDef->
20430 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a  xFinalize!=0 ){.
20440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20450 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
20460 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f  "unknown functio
20470 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a  n: %s()", zId);.
20480 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20490 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
204a0 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63   Attempt a direc
204b0 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
204c0 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   of the built-in
204d0 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a   COALESCE() and.
204e0 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28        ** IFNULL(
204f0 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  ) functions.  Th
20500 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65  is avoids unnece
20510 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e  ssary evaluation
20520 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67   of.      ** arg
20530 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20  uments past the 
20540 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  first non-NULL a
20550 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
20560 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
20570 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
20580 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53  LITE_FUNC_COALES
20590 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  CE ){.        in
205a0 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20  t endCoalesce = 
205b0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
205c0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
205d0 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
205e0 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
205f0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
20600 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
20610 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
20620 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
20630 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
20640 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20650 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20660 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67  OP_NotNull, targ
20670 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  et, endCoalesce)
20680 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
20690 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
206a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
206b0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
206c0 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29  arse, target, 1)
206d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
206e0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
206f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
20700 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20710 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
20720 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74  g->a[i].pExpr, t
20730 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
20740 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
20750 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
20760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20770 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
20780 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
20790 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
207a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
207b0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55  ..      /* The U
207c0 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69  NLIKELY() functi
207d0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
207e0 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
207f0 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
20800 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
20810 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
20820 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
20830 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
20840 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
20850 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  Y ){.        ass
20860 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b  ert( nFarg>=1 );
20870 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20880 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20890 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 46  arget(pParse, pF
208a0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
208b0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
208c0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
208d0 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20  _DEBUG.      /* 
208e0 54 68 65 20 41 46 46 49 4e 49 54 59 28 29 20 66  The AFFINITY() f
208f0 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74 65  unction evaluate
20900 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68  s to a string th
20910 61 74 20 64 65 73 63 72 69 62 65 73 0a 20 20 20  at describes.   
20920 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20 61     ** the type a
20930 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 61  ffinity of the a
20940 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 69  rgument.  This i
20950 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
20960 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ng of.      ** t
20970 68 65 20 53 51 4c 69 74 65 20 74 79 70 65 20 6c  he SQLite type l
20980 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ogic..      */. 
20990 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
209a0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
209b0 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 20  E_FUNC_AFFINITY 
209c0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
209d0 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d   char *azAff[] =
209e0 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78 74   { "blob", "text
209f0 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22 69  ", "numeric", "i
20a00 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22 20  nteger", "real" 
20a10 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  };.        char 
20a20 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73  aff;.        ass
20a30 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
20a40 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 73  .        aff = s
20a50 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
20a60 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  ty(pFarg->a[0].p
20a70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
20a80 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
20a90 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20  ring(v, target, 
20aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
20ac0 66 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53  ff ? azAff[aff-S
20ad0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20  QLITE_AFF_BLOB] 
20ae0 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20  : "none");.     
20af0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
20b00 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
20b10 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
20b20 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
20b30 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32          if( i<32
20b40 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
20b50 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d  sConstant(pFarg-
20b60 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
20b70 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
20b80 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20  se( i==31 );.   
20b90 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
20ba0 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29   |= MASKBIT32(i)
20bb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20bc0 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
20bd0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
20be0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29  E_FUNC_NEEDCOLL)
20bf0 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  !=0 && !pColl ){
20c00 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
20c10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
20c20 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46  llSeq(pParse, pF
20c30 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
20c40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20c50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
20c60 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arg ){.        i
20c70 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a  f( constMask ){.
20c80 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70            r1 = p
20c90 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
20ca0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
20cb0 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a  >nMem += nFarg;.
20cc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20cd0 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71           r1 = sq
20ce0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
20cf0 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29  e(pParse, nFarg)
20d00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
20d10 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67       /* For leng
20d20 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28  th() and typeof(
20d30 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68  ) functions with
20d40 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65   a column argume
20d50 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  nt,.        ** s
20d60 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65  et the P5 parame
20d70 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f  ter to the OP_Co
20d80 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f  lumn opcode to O
20d90 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a  PFLAG_LENGTHARG.
20da0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50          ** or OP
20db0 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72  FLAG_TYPEOFARG r
20dc0 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20  espectively, to 
20dd0 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72  avoid unnecessar
20de0 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a  y data.        *
20df0 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20  * loading..     
20e00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
20e10 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
20e20 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e  gs & (SQLITE_FUN
20e30 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f  C_LENGTH|SQLITE_
20e40 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30  FUNC_TYPEOF))!=0
20e50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
20e60 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20   exprOp;.       
20e70 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
20e80 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
20e90 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e   assert( pFarg->
20ea0 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
20eb0 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f  .          exprO
20ec0 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  p = pFarg->a[0].
20ed0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20  pExpr->op;.     
20ee0 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d       if( exprOp=
20ef0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78  =TK_COLUMN || ex
20f00 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  prOp==TK_AGG_COL
20f10 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
20f20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
20f30 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f  E_FUNC_LENGTH==O
20f40 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
20f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
20f60 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
20f70 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41  NC_TYPEOF==OPFLA
20f80 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20  G_TYPEOFARG );. 
20f90 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
20fa0 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46  ase( pDef->funcF
20fb0 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45  lags & OPFLAG_LE
20fc0 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
20fd0 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b         pFarg->a[
20fe0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20  0].pExpr->op2 = 
20ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21000 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61     pDef->funcFla
21010 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e  gs & (OPFLAG_LEN
21020 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59  GTHARG|OPFLAG_TY
21030 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
21040 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
21050 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21060 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
21070 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69  arse);     /* Ti
21080 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
21090 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  e */.        sql
210a0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
210b0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61  List(pParse, pFa
210c0 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20 20  rg, r1, 0,.     
210d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210e0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
210f0 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54  E_ECEL_DUP|SQLIT
21100 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a  E_ECEL_FACTOR);.
21110 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21120 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
21130 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63  se);      /* Tic
21140 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
21150 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
21160 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b  .        r1 = 0;
21170 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
21180 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
21190 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
211a0 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72  /* Possibly over
211b0 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f  load the functio
211c0 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61  n if the first a
211d0 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20  rgument is.     
211e0 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61   ** a virtual ta
211f0 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  ble column..    
21200 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
21210 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  r infix function
21220 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52  s (LIKE, GLOB, R
21230 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48  EGEXP, and MATCH
21240 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  ) use the.      
21250 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
21260 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73  nt, not the firs
21270 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  t, as the argume
21280 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20  nt to test to.  
21290 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
212a0 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
212b0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
212c0 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62    This is done b
212d0 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
212e0 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
212f0 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69   of infix functi
21300 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64  ons (the operand
21310 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20   we want to.    
21320 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65    ** control ove
21330 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75  rloading) ends u
21340 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  p as the second 
21350 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
21360 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
21370 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  n.  The expressi
21380 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73  on "A glob B" is
21390 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
213a0 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42        ** "glob(B
213b0 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f  ,A).  We want to
213c0 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41   use the A in "A
213d0 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74   glob B" to test
213e0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75  .      ** for fu
213f0 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
21400 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20  ng.  But we use 
21410 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67  the B term in "g
21420 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20  lob(B,A)"..     
21430 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46   */.      if( nF
21440 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72  arg>=2 && (pExpr
21450 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66  ->flags & EP_Inf
21460 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  ixFunc) ){.     
21470 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
21480 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
21490 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
214a0 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
214b0 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
214c0 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67   }else if( nFarg
214d0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
214e0 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
214f0 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
21500 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
21510 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
21520 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  xpr);.      }.#e
21530 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
21540 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
21550 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
21560 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
21570 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
21580 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
21590 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
215a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
215b0 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
215c0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
215d0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
215e0 51 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64  Q);.      }.#ifd
215f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
21600 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43  _OFFSET_SQL_FUNC
21610 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
21620 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
21630 49 54 45 5f 46 55 4e 43 5f 4f 46 46 53 45 54 20  ITE_FUNC_OFFSET 
21640 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
21650 2a 70 41 72 67 20 3d 20 70 46 61 72 67 2d 3e 61  *pArg = pFarg->a
21660 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
21670 20 20 20 69 66 28 20 70 41 72 67 2d 3e 6f 70 3d     if( pArg->op=
21680 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
21690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
216a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
216b0 4f 66 66 73 65 74 2c 20 70 41 72 67 2d 3e 69 54  Offset, pArg->iT
216c0 61 62 6c 65 2c 20 70 41 72 67 2d 3e 69 43 6f 6c  able, pArg->iCol
216d0 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
216e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
216f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21700 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
21710 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
21720 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21730 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
21740 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73 71      {.        sq
21750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
21760 76 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66  v, pParse->iSelf
21770 54 61 62 20 3f 20 4f 50 5f 50 75 72 65 46 75 6e  Tab ? OP_PureFun
21780 63 30 20 3a 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  c0 : OP_Function
21790 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
217b0 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67  stMask, r1, targ
217c0 65 74 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c  et, (char*)pDef,
217d0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
217e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
217f0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
21800 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d  )nFarg);.      }
21810 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
21820 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30   && constMask==0
21830 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
21840 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
21850 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
21860 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  nFarg);.      }.
21870 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
21880 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  get;.    }.#ifnd
21890 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
218a0 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
218b0 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
218c0 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
218d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
218e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
218f0 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ( op==TK_EXISTS 
21900 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21910 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  e( op==TK_SELECT
21920 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70   );.      if( op
21930 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 28  ==TK_SELECT && (
21940 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e  nCol = pExpr->x.
21950 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
21960 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20 20  >nExpr)!=1 ){.  
21970 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62        sqlite3Sub
21980 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  selectError(pPar
21990 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20  se, nCol, 1);.  
219a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
219b0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
219c0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
219d0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
219e0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
219f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21a00 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
21a10 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  CT_COLUMN: {.   
21a20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
21a30 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
21a40 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ->iTable==0 ){. 
21a50 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
21a60 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71  eft->iTable = sq
21a70 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
21a80 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
21a90 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a  ->pLeft, 0, 0);.
21aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
21ab0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
21ac0 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
21ad0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53  >pLeft->op==TK_S
21ae0 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69  ELECT );.      i
21af0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
21b00 0a 20 20 20 20 20 20 20 26 26 20 70 45 78 70 72  .       && pExpr
21b10 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73  ->iTable!=(n = s
21b20 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
21b30 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  Size(pExpr->pLef
21b40 74 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  t)) .      ){.  
21b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
21b60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
21b70 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e  d columns assign
21b80 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20  ed %d values",. 
21b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21bb0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29  Expr->iTable, n)
21bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21bd0 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c  return pExpr->pL
21be0 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45  eft->iTable + pE
21bf0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
21c00 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
21c10 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
21c20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
21c30 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
21c40 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
21c50 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
21c60 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
21c70 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
21c80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21c90 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
21ca0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
21cb0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
21cc0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
21cd0 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
21ce0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
21cf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21d00 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
21d10 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
21d20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
21d30 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
21d40 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
21d50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21d60 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
21d70 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20  target, 0);.    
21d80 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
21d90 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
21da0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
21db0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
21dc0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
21dd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
21de0 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a  ERY */...    /*.
21df0 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
21e00 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
21e10 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
21e20 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
21e30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
21e40 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
21e50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
21e60 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
21e70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
21e80 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
21e90 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
21ea0 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
21eb0 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
21ec0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
21ed0 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
21ee0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
21ef0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78  WEEN: {.      ex
21f00 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
21f10 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
21f20 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  get, 0, 0);.    
21f30 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
21f40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21f50 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61 73  TK_SPAN:.    cas
21f60 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20  e TK_COLLATE: . 
21f70 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
21f80 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
21f90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21fa0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
21fb0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
21fc0 67 65 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  get);.    }..   
21fd0 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52   case TK_TRIGGER
21fe0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
21ff0 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b  the opcode is TK
22000 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74  _TRIGGER, then t
22010 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
22020 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20   a reference.   
22030 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d     ** to a colum
22040 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f  n in the new.* o
22050 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  r old.* pseudo-t
22060 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
22070 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67  to.      ** trig
22080 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e  ger programs. In
22090 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e   this case Expr.
220a0 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
220b0 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   1 for the.     
220c0 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f   ** new.* pseudo
220d0 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72  -table, or 0 for
220e0 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
220f0 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43  o-table. Expr.iC
22100 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69  olumn.      ** i
22110 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
22120 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64  umn of the pseud
22130 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c  o-table to read,
22140 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20   or to -1 to.   
22150 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72     ** read the r
22160 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20  owid field..    
22170 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
22180 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
22190 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
221a0 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70  g an OP_Param op
221b0 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20  code. The p1.   
221c0 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
221d0 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20  is set to 0 for 
221e0 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66  an old.rowid ref
221f0 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69  erence, or to (i
22200 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  +1).      ** to 
22210 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65  reference anothe
22220 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  r column of the 
22230 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
22240 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20  le, where .     
22250 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
22260 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
22270 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69  . For a new.rowi
22280 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20  d reference, p1 
22290 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  is.      ** set 
222a0 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20  to (n+1), where 
222b0 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
222c0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61  of columns in ea
222d0 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  ch pseudo-table.
222e0 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
222f0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
22300 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e   other column in
22310 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64   the new.* pseud
22320 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20  o-table, p1.    
22330 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28    ** is set to (
22340 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20  n+2+i), where n 
22350 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66  and i are as def
22360 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e  ined previously.
22370 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78   For.      ** ex
22380 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
22390 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69  ble on which tri
223a0 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20  ggers are being 
223b0 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a  fired is.      *
223c0 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20  * declared as:. 
223d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
223e0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
223f0 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
22400 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  **.      ** Then
22410 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74   p1 is interpret
22420 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
22430 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
22440 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20     p1==0   ->   
22450 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70   old.rowid     p
22460 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==3   ->    new
22470 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20  .rowid.      ** 
22480 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20    p1==1   ->    
22490 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31  old.a         p1
224a0 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==4   ->    new.
224b0 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  a.      **   p1=
224c0 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62  =2   ->    old.b
224d0 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20           p1==5  
224e0 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20   ->    new.b    
224f0 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20     .      */.   
22500 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
22510 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
22520 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
22530 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
22540 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
22550 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
22560 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
22570 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
22580 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
22590 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
225a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
225b0 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
225c0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
225d0 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
225e0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
225f0 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
22600 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
22610 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
22620 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
22630 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
22640 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
22650 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22660 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
22670 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
22680 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
22690 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20  %s.%s -> $%d",. 
226a0 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
226b0 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
226c0 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
226d0 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
226e0 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
226f0 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  xpr->pTab->aCol[
22700 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
22710 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
22720 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b  target.      ));
22730 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
22740 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
22750 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66  OINT.      /* If
22760 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
22770 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69  REAL affinity, i
22780 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  t may currently 
22790 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a  be stored as an.
227a0 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
227b0 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66  . Use OP_RealAff
227c0 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75  inity to make su
227d0 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  re it is really 
227e0 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  real..      **. 
227f0 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
22800 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36  -OF: R-60985-576
22810 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63  62 SQLite will c
22820 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75 65  onvert the value
22830 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a   back to.      *
22840 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
22850 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67   when extracting
22860 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63   it from the rec
22870 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ord.  */.      i
22880 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
22890 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  n>=0 .       && 
228a0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  pTab->aCol[pExpr
228b0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  ->iColumn].affin
228c0 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
228d0 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20  REAL.      ){.  
228e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
228f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
22900 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67  alAffinity, targ
22910 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  et);.      }.#en
22920 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
22930 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
22940 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20   TK_VECTOR: {.  
22950 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
22960 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
22970 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
22980 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
22990 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
229a0 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b  K_IF_NULL_ROW: {
229b0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
229c0 4e 52 3b 0a 20 20 20 20 20 20 61 64 64 72 49 4e  NR;.      addrIN
229d0 52 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  R = sqlite3VdbeA
229e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75  ddOp1(v, OP_IfNu
229f0 6c 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54  llRow, pExpr->iT
22a00 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  able);.      sql
22a10 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
22a20 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
22a30 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
22a40 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
22a50 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
22a60 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
22a70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
22a80 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
22a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22aa0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
22ab0 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20 73 71  drINR);.      sq
22ac0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
22ad0 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20 69 6e  3(v, addrINR, in
22ae0 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
22af0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
22b00 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
22b10 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
22b20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
22b30 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
22b40 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
22b50 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
22b60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
22b70 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
22b80 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
22b90 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
22ba0 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
22bb0 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
22bc0 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
22bd0 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
22be0 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
22bf0 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
22c00 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
22c10 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
22c20 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
22c30 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
22c40 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
22c50 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
22c60 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
22c70 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
22c80 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
22c90 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
22ca0 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
22cb0 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20   is in the last 
22cc0 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72  element of pExpr
22cd0 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78  ->x.pList if pEx
22ce0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
22cf0 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64  pr is.    ** odd
22d00 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
22d10 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
22d20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
22d30 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74  ments in x.pList
22d40 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c  .    ** is even,
22d50 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74   then Y is omitt
22d60 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65  ed and the "othe
22d70 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73  rwise" result is
22d80 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
22d90 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
22da0 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
22db0 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
22dc0 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
22dd0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
22de0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
22df0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
22e00 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
22e10 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
22e20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
22e30 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
22e40 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
22e50 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
22e60 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
22e70 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
22e80 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
22e90 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
22ea0 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
22eb0 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ed0 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
22ee0 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
22ef0 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
22f00 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
22f30 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
22f40 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
22f50 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f70 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
22f80 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
22f90 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
22fc0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
22fd0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ff0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
23000 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
23010 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23020 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
23030 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
23040 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
23050 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
23060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23070 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
23080 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
23090 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
230a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
230c0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
230d0 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
230e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
230f0 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
23100 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
23110 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20  Ei (form B) */. 
23120 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69       VVA_ONLY( i
23130 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d  nt iCacheLevel =
23140 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
23150 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61  evel; )..      a
23160 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
23170 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
23180 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20  P_xIsSelect) && 
23190 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
231a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
231b0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
231c0 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
231d0 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
231e0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
231f0 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
23200 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
23210 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
23220 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
23230 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
23240 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
23250 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
23260 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
23270 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20  {.        tempX 
23280 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74  = *pX;.        t
23290 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
232a0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
232b0 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69        exprToRegi
232c0 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78 70  ster(&tempX, exp
232d0 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72  rCodeVector(pPar
232e0 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67  se, &tempX, &reg
232f0 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20  Free1));.       
23300 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
23310 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
23320 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70    memset(&opComp
23330 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f  are, 0, sizeof(o
23340 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20 20  pCompare));.    
23350 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70      opCompare.op
23360 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   = TK_EQ;.      
23370 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66    opCompare.pLef
23380 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20  t = &tempX;.    
23390 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43      pTest = &opC
233a0 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20  ompare;.        
233b0 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39  /* Ticket b351d9
233c0 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62  5f9cd5ef17e9d9db
233d0 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30  ae18f5ca86111900
233e0 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  01:.        ** T
233f0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46  he value in regF
23400 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53  ree1 might get S
23410 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65  Copy-ed into the
23420 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20   file result..  
23430 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65        ** So make
23440 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72   sure that the r
23450 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72  egFree1 register
23460 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66   is not reused f
23470 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20  or other.       
23480 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64   ** purposes and
23490 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72   possibly overwr
234a0 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20  itten.  */.     
234b0 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b     regFree1 = 0;
234c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
234d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d  or(i=0; i<nExpr-
234e0 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20  1; i=i+2){.     
234f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
23500 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
23510 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20  .        if( pX 
23520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
23530 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b  ert( pTest!=0 );
23540 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  .          opCom
23550 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c  pare.pRight = aL
23560 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
23570 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
23580 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74  .          pTest
23590 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e   = aListelem[i].
235a0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  pExpr;.        }
235b0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73  .        nextCas
235c0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
235d0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
235e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
235f0 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Test->op==TK_COL
23600 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
23610 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
23620 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
23630 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
23640 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
23650 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
23660 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
23670 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
23680 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
23690 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
236a0 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
236b0 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61  m[i+1].pExpr, ta
236c0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
236d0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
236e0 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
236f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23700 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
23710 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
23720 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
23730 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
23740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23750 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29  ( (nExpr&1)!=0 )
23760 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23770 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
23780 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
23790 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
237a0 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
237b0 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72  a[nExpr-1].pExpr
237c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
237d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
237e0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
237f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23810 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
23820 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
23830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
23840 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
23850 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
23860 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
23870 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
23880 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
23890 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20  el==iCacheLevel 
238a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
238b0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
238c0 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
238d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
238e0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
238f0 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
23900 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
23910 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
23920 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
23930 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
23940 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
23950 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
23960 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20  _Abort.         
23970 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
23980 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  nity==OE_Fail.  
23990 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
239a0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
239b0 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a  Ignore.      );.
239c0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
239d0 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29  e->pTriggerTab )
239e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
239f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23a00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23a10 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
23a20 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
23a30 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
23a40 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
23a50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
23a60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23a70 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
23a80 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  ty==OE_Abort ){.
23a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
23aa0 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
23ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
23ac0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
23ad0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
23ae0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
23af0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
23b00 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
23b10 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
23b20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
23b30 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
23b40 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
23b50 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  _OK, OE_Ignore, 
23b60 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
23b70 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56  en,0);.        V
23b80 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
23b90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23ba0 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
23bb0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
23bc0 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  e, SQLITE_CONSTR
23bd0 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20  AINT_TRIGGER,.  
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
23c00 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78  r->affinity, pEx
23c10 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
23c20 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
23c30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
23c40 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
23c50 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
23c60 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
23c70 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
23c80 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
23c90 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
23ca0 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
23cb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f  ;.}../*.** Facto
23cc0 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f  r out the code o
23cd0 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
23ce0 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61  ession to initia
23cf0 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
23d00 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73 74 3e  *.** If regDest>
23d10 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  =0 then the resu
23d20 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f  lt is always sto
23d30 72 65 64 20 69 6e 20 74 68 61 74 20 72 65 67 69  red in that regi
23d40 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ster and the.** 
23d50 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 72 65  result is not re
23d60 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65 67 44  usable.  If regD
23d70 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69 73 20  est<0 then this 
23d80 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65 65 20  routine is free 
23d90 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  to .** store the
23da0 20 76 61 6c 75 65 20 77 68 65 72 65 65 76 65 72   value whereever
23db0 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68 65 20   it wants.  The 
23dc0 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 74  register where t
23dd0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a  he expression .*
23de0 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73 20 72  * is stored is r
23df0 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e 20 72  eturned.  When r
23e00 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20 69 64  egDest<0, two id
23e10 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73 73 69  entical expressi
23e20 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65  ons will.** code
23e30 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65 67   to the same reg
23e40 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
23e50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
23e60 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nit(.  Parse *pP
23e70 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
23e80 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
23e90 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
23ea0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
23eb0 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65  sion to code whe
23ec0 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69  n the VDBE initi
23ed0 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20  alizes */.  int 
23ee0 72 65 67 44 65 73 74 20 20 20 20 20 20 20 2f 2a  regDest       /*
23ef0 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   Store the value
23f00 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
23f10 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  r */.){.  ExprLi
23f20 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  st *p;.  assert(
23f30 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
23f40 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20  Parse) );.  p = 
23f50 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
23f60 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44 65 73  pr;.  if( regDes
23f70 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20 20 20  t<0 && p ){.    
23f80 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23f90 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
23fa0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
23fb0 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d  pItem=p->a, i=p-
23fc0 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74  >nExpr; i>0; pIt
23fd0 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20  em++, i--){.    
23fe0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75    if( pItem->reu
23ff0 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33  sable && sqlite3
24000 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 49  ExprCompare(0,pI
24010 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72  tem->pExpr,pExpr
24020 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,-1)==0 ){.     
24030 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d     return pItem-
24040 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
24050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24060 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 73 71    }.  pExpr = sq
24070 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
24080 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
24090 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  0);.  p = sqlite
240a0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
240b0 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72  pParse, p, pExpr
240c0 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
240d0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
240e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
240f0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d   &p->a[p->nExpr-
24100 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  1];.     pItem->
24110 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67 44 65  reusable = regDe
24120 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28 20 72  st<0;.     if( r
24130 65 67 44 65 73 74 3c 30 20 29 20 72 65 67 44 65  egDest<0 ) regDe
24140 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  st = ++pParse->n
24150 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  Mem;.     pItem-
24160 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
24170 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a   = regDest;.  }.
24180 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74    pParse->pConst
24190 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65 74 75  Expr = p;.  retu
241a0 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f  rn regDest;.}../
241b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
241c0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
241d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
241e0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
241f0 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
24200 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
24210 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
24220 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
24230 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
24240 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
24250 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
24260 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
24270 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
24280 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
24290 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
242a0 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
242b0 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
242c0 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
242d0 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
242e0 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
242f0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
24300 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
24310 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
24320 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
24330 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
24340 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
24350 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
24360 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
24370 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
24380 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
24390 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
243a0 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
243b0 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
243c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
243d0 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
243e0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
243f0 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
24400 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
24410 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
24420 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
24430 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73  xpr);.  if( Cons
24440 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
24450 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f  ).   && pExpr->o
24460 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  p!=TK_REGISTER. 
24470 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
24480 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
24490 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20  n(pExpr).  ){.  
244a0 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20    *pReg  = 0;.  
244b0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
244c0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
244d0 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b  rse, pExpr, -1);
244e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
244f0 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
24500 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
24510 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
24520 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
24530 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24540 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d  r1);.    if( r2=
24550 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  =r1 ){.      *pR
24560 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c  eg = r1;.    }el
24570 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
24580 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
24590 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
245a0 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20     *pReg = 0;.  
245b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
245c0 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   r2;.}../*.** Ge
245d0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
245e0 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
245f0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
24600 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
24610 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
24620 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
24630 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
24640 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
24650 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
24660 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69  r target..*/.voi
24670 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
24680 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
24690 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
246a0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74  t target){.  int
246b0 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72   inReg;..  asser
246c0 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
246d0 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
246e0 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78  Mem );.  if( pEx
246f0 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  pr && pExpr->op=
24700 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
24710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24720 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
24730 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45  dbe, OP_Copy, pE
24740 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
24750 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  get);.  }else{. 
24760 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
24770 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
24780 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24790 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73  target);.    ass
247a0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
247b0 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  be!=0 || pParse-
247c0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
247d0 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52  d );.    if( inR
247e0 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50  eg!=target && pP
247f0 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
24800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24810 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
24820 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
24830 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
24840 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
24850 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69  ** Make a transi
24860 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72  ent copy of expr
24870 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
24880 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73   then code it us
24890 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78  ing.** sqlite3Ex
248a0 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20  prCode().  This 
248b0 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75  routine works ju
248c0 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45  st like sqlite3E
248d0 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63  xprCode().** exc
248e0 65 70 74 20 74 68 61 74 20 74 68 65 20 69 6e 70  ept that the inp
248f0 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ut expression is
24900 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
24910 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
24920 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
24930 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a  CodeCopy(Parse *
24940 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
24950 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
24960 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
24970 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
24980 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
24990 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
249a0 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d  , 0);.  if( !db-
249b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
249c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
249d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
249e0 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  arget);.  sqlite
249f0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
24a00 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
24a10 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
24a20 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
24a30 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
24a40 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
24a50 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
24a60 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
24a70 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
24a80 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
24a90 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
24aa0 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49 66  ster target.  If
24ab0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24ac0 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  is constant, the
24ad0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
24ae0 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74  * might choose t
24af0 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72 65  o code the expre
24b00 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c  ssion at initial
24b10 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f  ization time..*/
24b20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
24b30 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
24b40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
24b50 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
24b60 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70  target){.  if( p
24b70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
24b80 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45  ctor && sqlite3E
24b90 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
24ba0 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  xpr) ){.    sqli
24bb0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
24bc0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
24bd0 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
24be0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
24bf0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
24c00 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
24c10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
24c20 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65  rate code that e
24c30 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69 76  valuates the giv
24c40 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
24c50 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c  d puts the resul
24c60 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  t.** in register
24c70 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   target..**.** A
24c80 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  lso make a copy 
24c90 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
24ca0 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  n results into a
24cb0 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72  nother "cache" r
24cc0 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d  egister.** and m
24cd0 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73  odify the expres
24ce0 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65  sion so that the
24cf0 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
24d00 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74   evaluated,.** t
24d10 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
24d20 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65  opy of the cache
24d30 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
24d40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
24d50 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73   used for expres
24d60 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  sions that are u
24d70 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  sed multiple .**
24d80 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72   times.  They ar
24d90 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  e evaluated once
24da0 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73   and the results
24db0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
24dc0 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64  on.** are reused
24dd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24de0 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68  3ExprCodeAndCach
24df0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
24e00 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
24e10 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
24e20 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
24e30 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d  Vdbe;.  int iMem
24e40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
24e50 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  get>0 );.  asser
24e60 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
24e70 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73  _REGISTER );.  s
24e80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
24e90 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
24ea0 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20  rget);.  iMem = 
24eb0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
24ec0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24ed0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
24ee0 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20  target, iMem);. 
24ef0 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
24f00 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a  pExpr, iMem);.}.
24f10 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24f20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
24f30 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
24f40 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
24f50 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
24f60 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f  ession list into
24f70 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
24f80 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
24f90 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a  ng at target..**
24fa0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
24fb0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
24fc0 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20 54 68  s evaluated.  Th
24fd0 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
24fe0 64 20 77 69 6c 6c 0a 2a 2a 20 75 73 75 61 6c 6c  d will.** usuall
24ff0 79 20 62 65 20 70 4c 69 73 74 2d 3e 6e 45 78 70  y be pList->nExp
25000 72 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 72  r but might be r
25010 65 64 75 63 65 64 20 69 66 20 53 51 4c 49 54 45  educed if SQLITE
25020 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 0a 2a 2a  _ECEL_OMITREF.**
25030 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a   is defined..**.
25040 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
25050 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76  EL_DUP flag prev
25060 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e  ents the argumen
25070 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ts from being.**
25080 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50   filled using OP
25090 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79  _SCopy.  OP_Copy
250a0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e   must be used in
250b0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stead..**.** The
250c0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
250d0 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c  TOR argument all
250e0 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ows constant arg
250f0 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20  uments to be.** 
25100 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74  factored out int
25110 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
25120 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
25130 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
25140 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74   flag means that
25150 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
25160 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a  the list with.**
25170 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e   ExprList.a[].u.
25180 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
25190 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
251a0 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  n evaluated and 
251b0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67  stored.** in reg
251c0 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65 67  isters at srcReg
251d0 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c  , and so the val
251e0 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64  ue can be copied
251f0 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2a 20   from there..** 
25200 49 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f  If SQLITE_ECEL_O
25210 4d 49 54 52 45 46 20 69 73 20 61 6c 73 6f 20 73  MITREF is also s
25220 65 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  et, then the val
25230 75 65 73 20 77 69 74 68 20 75 2e 78 2e 69 4f 72  ues with u.x.iOr
25240 64 65 72 42 79 43 6f 6c 3e 30 0a 2a 2a 20 61 72  derByCol>0.** ar
25250 65 20 73 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64  e simply omitted
25260 20 72 61 74 68 65 72 20 74 68 61 6e 20 62 65 69   rather than bei
25270 6e 67 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73  ng copied from s
25280 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rcReg..*/.int sq
25290 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
252a0 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
252b0 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
252c0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
252d0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
252e0 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
252f0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
25300 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
25310 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
25320 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
25330 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
25340 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20   int srcReg,    
25350 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65      /* Source re
25360 67 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54  gisters if SQLIT
25370 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20  E_ECEL_REF */.  
25380 75 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  u8 flags        
25390 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45     /* SQLITE_ECE
253a0 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  L_* flags */.){.
253b0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
253c0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
253d0 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20   int i, j, n;.  
253e0 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61  u8 copyOp = (fla
253f0 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
25400 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20  _DUP) ? OP_Copy 
25410 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64  : OP_SCopy;.  Vd
25420 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
25430 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
25440 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
25450 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
25460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
25470 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  rse->pVdbe!=0 );
25480 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20    /* Never gets 
25490 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69  this far otherwi
254a0 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73  se */.  n = pLis
254b0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
254c0 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70  !ConstFactorOk(p
254d0 50 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26  Parse) ) flags &
254e0 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  = ~SQLITE_ECEL_F
254f0 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74  ACTOR;.  for(pIt
25500 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
25510 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
25520 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
25530 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  pExpr = pItem->p
25540 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66  Expr;.    if( (f
25550 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
25560 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a  EL_REF)!=0 && (j
25570 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
25580 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a  rderByCol)>0 ){.
25590 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
255a0 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d  & SQLITE_ECEL_OM
255b0 49 54 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20  ITREF ){.       
255c0 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d   i--;.        n-
255d0 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
255e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
255f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
25600 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c  yOp, j+srcReg-1,
25610 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
25620 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
25630 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
25640 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d  E_ECEL_FACTOR)!=
25650 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  0 && sqlite3Expr
25660 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
25670 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
25680 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
25690 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
256a0 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d  target+i);.    }
256b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
256c0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
256d0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
256e0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
256f0 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66  get+i);.      if
25700 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b  ( inReg!=target+
25710 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  i ){.        Vdb
25720 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
25730 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50    if( copyOp==OP
25740 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
25750 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64  & (pOp=sqlite3Vd
25760 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d  beGetOp(v, -1))-
25770 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79  >opcode==OP_Copy
25780 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
25790 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d  ->p1+pOp->p3+1==
257a0 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  inReg.         &
257b0 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70  & pOp->p2+pOp->p
257c0 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20  3+1==target+i.  
257d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
257e0 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20     pOp->p3++;.  
257f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
25810 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79  beAddOp2(v, copy
25820 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  Op, inReg, targe
25830 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t+i);.        }.
25840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25850 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
25860 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
25870 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45  code for a BETWE
25880 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  EN operator..**.
25890 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
258a0 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68  y AND z.**.** Th
258b0 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76  e above is equiv
258c0 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20  alent to .**.** 
258d0 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
258e0 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61  .**.** Code it a
258f0 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63  s such, taking c
25900 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  are to do the co
25910 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69  mmon subexpressi
25920 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f  on.** eliminatio
25930 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68  n of x..**.** Th
25940 65 20 78 4a 75 6d 70 49 66 20 70 61 72 61 6d 65  e xJumpIf parame
25950 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 64  ter determines d
25960 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  etails:.**.**   
25970 20 4e 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20   NULL:          
25980 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74           Store t
25990 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
259a0 74 20 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a  t in reg[dest].*
259b0 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  *    sqlite3Expr
259c0 49 66 54 72 75 65 3a 20 20 20 20 20 20 4a 75 6d  IfTrue:      Jum
259d0 70 20 74 6f 20 64 65 73 74 20 69 66 20 74 72 75  p to dest if tru
259e0 65 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45  e.**    sqlite3E
259f0 78 70 72 49 66 46 61 6c 73 65 3a 20 20 20 20 20  xprIfFalse:     
25a00 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20  Jump to dest if 
25a10 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  false.**.** The 
25a20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d  jumpIfNull param
25a30 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
25a40 69 66 20 78 4a 75 6d 70 49 66 20 69 73 20 4e 55  if xJumpIf is NU
25a50 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
25a60 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65  id exprCodeBetwe
25a70 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
25a80 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
25a90 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
25aa0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
25ab0 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
25ac0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54        /* The BET
25ad0 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  WEEN expression 
25ae0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
25af0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
25b00 65 73 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74  estination or st
25b10 6f 72 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a  orage location *
25b20 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70  /.  void (*xJump
25b30 29 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69  )(Parse*,Expr*,i
25b40 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69  nt,int), /* Acti
25b50 6f 6e 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20  on to take */.  
25b60 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20  int jumpIfNull  
25b70 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75    /* Take the ju
25b80 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45  mp if the BETWEE
25b90 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  N is NULL */.){.
25ba0 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20   Expr exprAnd;  
25bb0 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70     /* The AND op
25bc0 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20  erator in  x>=y 
25bd0 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45  AND x<=z  */.  E
25be0 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20  xpr compLeft;   
25bf0 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74   /* The  x>=y  t
25c00 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  erm */.  Expr co
25c10 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68  mpRight;   /* Th
25c20 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f  e  x<=z  term */
25c30 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20  .  Expr exprX;  
25c40 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20       /* The  x  
25c50 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
25c60 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
25c70 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72  = 0; /* Temporar
25c80 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a  y use register *
25c90 2f 0a 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f  /...  memset(&co
25ca0 6d 70 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f  mpLeft, 0, sizeo
25cb0 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73  f(Expr));.  mems
25cc0 65 74 28 26 63 6f 6d 70 52 69 67 68 74 2c 20 30  et(&compRight, 0
25cd0 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
25ce0 0a 20 20 6d 65 6d 73 65 74 28 26 65 78 70 72 41  .  memset(&exprA
25cf0 6e 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  nd, 0, sizeof(Ex
25d00 70 72 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  pr));..  assert(
25d10 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
25d20 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
25d30 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72  elect) );.  expr
25d40 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
25d50 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20  t;.  exprAnd.op 
25d60 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72  = TK_AND;.  expr
25d70 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
25d80 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
25d90 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52  .pRight = &compR
25da0 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  ight;.  compLeft
25db0 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63  .op = TK_GE;.  c
25dc0 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
25dd0 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65  &exprX;.  compLe
25de0 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
25df0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
25e00 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69  .pExpr;.  compRi
25e10 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
25e20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
25e30 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
25e40 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
25e50 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
25e60 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65  >a[1].pExpr;.  e
25e70 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65  xprToRegister(&e
25e80 78 70 72 58 2c 20 65 78 70 72 43 6f 64 65 56 65  xprX, exprCodeVe
25e90 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 65 78  ctor(pParse, &ex
25ea0 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  prX, &regFree1))
25eb0 3b 0a 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b  ;.  if( xJump ){
25ec0 0a 20 20 20 20 78 4a 75 6d 70 28 70 50 61 72 73  .    xJump(pPars
25ed0 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
25ee0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
25ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
25f00 4d 61 72 6b 20 74 68 65 20 65 78 70 72 65 73 73  Mark the express
25f10 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 66 72 6f  ion is being fro
25f20 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
25f30 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
25f40 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61  in.    ** so tha
25f50 74 20 74 68 65 20 73 71 6c 69 74 65 33 45 78 70  t the sqlite3Exp
25f60 72 43 6f 64 65 54 61 72 67 65 74 28 29 20 72 6f  rCodeTarget() ro
25f70 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61  utine will not a
25f80 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20  ttempt to move. 
25f90 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68     ** it into th
25fa0 65 20 50 61 72 73 65 2e 70 43 6f 6e 73 74 45 78  e Parse.pConstEx
25fb0 70 72 20 6c 69 73 74 2e 20 20 57 65 20 73 68 6f  pr list.  We sho
25fc0 75 6c 64 20 75 73 65 20 61 20 6e 65 77 20 62 69  uld use a new bi
25fd0 74 20 66 6f 72 20 74 68 69 73 2c 0a 20 20 20 20  t for this,.    
25fe0 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20  ** for clarity, 
25ff0 62 75 74 20 77 65 20 61 72 65 20 6f 75 74 20 6f  but we are out o
26000 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 45 78  f bits in the Ex
26010 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 73  pr.flags field s
26020 6f 20 77 65 0a 20 20 20 20 2a 2a 20 68 61 76 65  o we.    ** have
26030 20 74 6f 20 72 65 75 73 65 20 74 68 65 20 45 50   to reuse the EP
26040 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20  _FromJoin bit.  
26050 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65  Bummer. */.    e
26060 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50  xprX.flags |= EP
26070 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73  _FromJoin;.    s
26080 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
26090 72 67 65 74 28 70 50 61 72 73 65 2c 20 26 65 78  rget(pParse, &ex
260a0 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20  prAnd, dest);.  
260b0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
260c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
260d0 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20  , regFree1);..  
260e0 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61  /* Ensure adequa
260f0 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65  te test coverage
26100 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
26110 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
26120 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
26130 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
26140 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
26150 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
26160 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
26170 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
26180 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
26190 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
261a0 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
261b0 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
261c0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
261d0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
261e0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
261f0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
26200 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
26210 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
26220 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
26230 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
26240 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
26250 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
26260 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
26270 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26280 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26290 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
262a0 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
262b0 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
262c0 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
262d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
262e0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
262f0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
26300 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
26310 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
26320 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
26330 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
26340 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
26350 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30  stcase( xJump==0
26360 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   );.}../*.** Gen
26370 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
26380 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
26390 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
263a0 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
263b0 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
263c0 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
263d0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
263e0 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
263f0 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
26400 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
26410 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
26420 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
26430 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
26440 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
26450 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
26460 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
26470 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
26480 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
26490 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  lag is SQLITE_JU
264a0 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  MPIFNULL..**.** 
264b0 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
264c0 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
264d0 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
264e0 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
264f0 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
26500 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
26510 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
26520 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
26530 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
26540 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
26550 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
26560 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
26570 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
26580 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
26590 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
265a0 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
265b0 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
265c0 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
265d0 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
265e0 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
265f0 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
26600 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
26610 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
26620 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61  fTrue(Parse *pPa
26630 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
26640 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
26650 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
26660 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
26670 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
26680 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
26690 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
266a0 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
266b0 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
266c0 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
266d0 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
266e0 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
266f0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
26700 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20  EVER(v==0) )    
26710 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69   return;  /* Exi
26720 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
26730 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
26740 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
26750 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75  pExpr==0) ) retu
26760 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74  rn;  /* No way t
26770 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a  his can happen *
26780 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  /.  op = pExpr->
26790 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
267a0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
267b0 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
267c0 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
267d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
267e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
267f0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26800 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26810 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
26820 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
26830 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  2,jumpIfNull^SQL
26840 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
26850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26860 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
26870 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
26880 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
26890 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
268a0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
268b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
268c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
268d0 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
268e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
268f0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
26900 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26910 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
26920 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  R: {.      testc
26930 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
26940 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
26950 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
26960 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26970 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
26980 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
26990 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
269a0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
269b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
269c0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
269d0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
269e0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
269f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
26a00 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
26a10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26a20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
26a30 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
26a40 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
26a50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
26a60 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
26a70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
26a80 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
26a90 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
26aa0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26ab0 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
26ac0 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
26ad0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
26ae0 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
26af0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
26b00 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
26b10 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
26b20 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
26b30 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66  NE;.      jumpIf
26b40 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55  Null = SQLITE_NU
26b50 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46  LLEQ;.      /* F
26b60 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
26b70 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
26b80 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
26b90 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
26ba0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
26bb0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
26bc0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
26bd0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
26be0 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70  xprIsVector(pExp
26bf0 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f  r->pLeft) ) goto
26c00 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20   default_expr;. 
26c10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
26c20 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26c30 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
26c40 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
26c50 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
26c60 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
26c70 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
26c80 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
26c90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
26ca0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
26cb0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
26cc0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
26cd0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
26ce0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
26cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d00 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
26d10 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
26d20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
26d30 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
26d40 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
26d50 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
26d60 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
26d70 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
26d80 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
26d90 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
26da0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
26db0 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
26dc0 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
26dd0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
26de0 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
26df0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
26e00 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
26e10 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
26e20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
26e30 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
26e40 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
26e50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26e60 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
26e70 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
26e80 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  q);.      VdbeCo
26e90 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
26ea0 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
26eb0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
26ec0 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
26ed0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26ee0 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
26ef0 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
26f00 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LEQ);.      asse
26f10 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
26f20 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
26f30 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Ne);.      Vdb
26f40 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26f50 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
26f60 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
26f70 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
26f80 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
26f90 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
26fa0 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
26fb0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74  NULLEQ);.      t
26fc0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
26fd0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
26fe0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
26ff0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
27000 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
27010 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
27020 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
27030 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  L: {.      asser
27040 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
27050 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73  _IsNull );   tes
27060 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
27070 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73  NULL );.      as
27080 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
27090 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20  ==OP_NotNull ); 
270a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
270b0 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
270c0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
270d0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
270e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
270f0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
27100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27110 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
27120 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62  dest);.      Vdb
27130 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27140 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
27150 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27160 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
27170 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  TNULL);.      te
27180 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
27190 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
271a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
271b0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
271c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
271d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
271e0 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
271f0 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
27200 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c  pExpr, dest, sql
27210 69 74 65 33 45 78 70 72 49 66 54 72 75 65 2c 20  ite3ExprIfTrue, 
27220 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27230 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27240 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27250 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
27260 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
27270 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
27280 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
27290 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
272a0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
272b0 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c  Null = jumpIfNul
272c0 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49  l ? dest : destI
272d0 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71  fFalse;.      sq
272e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
272f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
27300 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
27310 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
27320 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
27330 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
27340 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
27350 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
27360 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72  False);.      br
27370 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
27380 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
27390 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70  .    default_exp
273a0 72 3a 0a 20 20 20 20 20 20 69 66 28 20 65 78 70  r:.      if( exp
273b0 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70  rAlwaysTrue(pExp
273c0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
273d0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
273e0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
273f0 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61  lse if( exprAlwa
27400 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29  ysFalse(pExpr) )
27410 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d  {.        /* No-
27420 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
27430 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
27440 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27450 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27460 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
27470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27480 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
27490 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  f, r1, dest, jum
274a0 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
274b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
274c0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
274d0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
274e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
274f0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27500 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27510 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
27520 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
27530 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
27540 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
27550 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
27560 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
27570 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20  se, regFree2);  
27580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
27590 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
275a0 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
275b0 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
275c0 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
275d0 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
275e0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
275f0 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20  on is false but 
27600 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
27610 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
27620 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
27630 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a  ession is true..
27640 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
27650 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
27660 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
27670 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
27680 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  e) then.** jump 
27690 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
276a0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
276b0 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75  LL or fall throu
276c0 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  gh if jumpIfNull
276d0 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69  .** is 0..*/.voi
276e0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
276f0 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  alse(Parse *pPar
27700 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
27710 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
27720 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
27730 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
27740 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
27750 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
27760 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
27770 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
27780 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
27790 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
277a0 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
277b0 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
277c0 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
277d0 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
277e0 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65  rn; /* Existence
277f0 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64   of VDBE checked
27800 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20   by caller */.  
27810 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20  if( pExpr==0 )  
27820 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
27830 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78  The value of pEx
27840 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72  pr->op and op ar
27850 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c  e related as fol
27860 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
27870 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
27880 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20             op.  
27890 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  **       -------
278a0 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  --          ----
278b0 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20  ------.  **     
278c0 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20    TK_ISNULL     
278d0 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a       OP_NotNull.
278e0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f    **       TK_NO
278f0 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50  TNULL         OP
27900 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  _IsNull.  **    
27910 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20     TK_NE        
27920 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a        OP_Eq.  **
27930 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20         TK_EQ    
27940 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a            OP_Ne.
27950 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54    **       TK_GT
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
27970 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Le.  **       T
27980 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  K_LE            
27990 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20    OP_Gt.  **    
279a0 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20     TK_GE        
279b0 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a        OP_Lt.  **
279c0 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20         TK_LT    
279d0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a            OP_Ge.
279e0 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74    **.  ** For ot
279f0 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45  her values of pE
27a00 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75  xpr->op, op is u
27a10 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75  ndefined and unu
27a20 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  sed..  ** The va
27a30 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  lue of TK_ and O
27a40 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  P_ constants are
27a50 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74   arranged such t
27a60 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20  hat we.  ** can 
27a70 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70  compute the mapp
27a80 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20  ing above using 
27a90 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
27aa0 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41  pression..  ** A
27ab0 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20  ssert()s verify 
27ac0 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61  that the computa
27ad0 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e  tion is correct.
27ae0 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70  .  */.  op = ((p
27af0 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e  Expr->op+(TK_ISN
27b00 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49  ULL&1))^1)-(TK_I
27b10 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20  SNULL&1);..  /* 
27b20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61  Verify correct a
27b30 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20  lignment of TK_ 
27b40 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
27b50 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
27b60 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
27b70 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  SNULL || op==OP_
27b80 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  NotNull );.  ass
27b90 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
27ba0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70  TK_NOTNULL || op
27bb0 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
27bc0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
27bd0 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d  op!=TK_NE || op=
27be0 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65  =OP_Eq );.  asse
27bf0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
27c00 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  K_EQ || op==OP_N
27c10 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
27c20 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20  Expr->op!=TK_LT 
27c30 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a  || op==OP_Ge );.
27c40 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
27c50 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70  >op!=TK_LE || op
27c60 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73  ==OP_Gt );.  ass
27c70 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
27c80 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GT || op==OP_
27c90 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Le );.  assert( 
27ca0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45  pExpr->op!=TK_GE
27cb0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b   || op==OP_Lt );
27cc0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
27cd0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
27ce0 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
27cf0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27d00 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27d10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27d20 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
27d30 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
27d40 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27d50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27d60 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
27d70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27d80 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
27d90 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
27da0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
27db0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
27dc0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
27dd0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
27de0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27df0 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
27e00 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
27e10 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
27e20 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
27e30 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
27e40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
27e50 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
27e60 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27e70 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e  eft, d2, jumpIfN
27e80 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
27e90 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
27ea0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
27eb0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
27ec0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
27ed0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
27ee0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
27ef0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27f00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27f10 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
27f20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d2);.      sqlit
27f30 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
27f40 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
27f50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
27f60 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
27f70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
27f80 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
27f90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27fa0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
27fb0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
27fc0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
27fd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27fe0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
27ff0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
28000 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
28010 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
28020 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
28030 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
28040 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
28050 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78  .      op = (pEx
28060 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f  pr->op==TK_IS) ?
28070 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a   TK_NE : TK_EQ;.
28080 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c        jumpIfNull
28090 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
280a0 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
280b0 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
280c0 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
280d0 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
280e0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
280f0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
28100 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
28110 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
28120 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
28130 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70  sVector(pExpr->p
28140 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66  Left) ) goto def
28150 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20  ault_expr;.     
28160 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
28170 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
28180 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
28190 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
281a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
281b0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
281c0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
281d0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
281e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
281f0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
28200 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
28210 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
28220 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
28230 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
28240 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
28250 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
28260 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
28270 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
28280 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
28290 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
282a0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
282b0 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
282c0 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
282d0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
282e0 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
282f0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
28300 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28310 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
28320 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
28330 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
28340 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
28350 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
28360 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
28370 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
28380 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
28390 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
283a0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
283b0 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
283c0 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  ase(op==OP_Eq);.
283d0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
283e0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
283f0 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  q && jumpIfNull!
28400 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
28410 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
28420 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
28430 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
28440 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
28450 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
28460 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
28470 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
28480 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
28490 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
284a0 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
284b0 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
284c0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
284d0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
284e0 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
284f0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
28500 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
28510 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
28520 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28530 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
28540 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
28550 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
28560 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
28570 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
28580 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
28590 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
285a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
285b0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
285c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
285d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
285e0 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
285f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
28600 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56  TK_ISNULL );   V
28610 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28620 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
28630 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28640 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
28650 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
28660 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
28670 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
28680 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
28690 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
286a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
286b0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
286c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
286d0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
286e0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
286f0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
28700 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
28710 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20  te3ExprIfFalse, 
28720 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
28730 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28740 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28750 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
28760 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
28770 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
28780 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
28790 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
287a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
287b0 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
287c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
287d0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
287e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
287f0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
28800 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
28810 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
28820 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49  xpr, dest, destI
28830 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
28840 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
28850 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
28860 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  fNull);.      }.
28870 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28880 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
28890 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
288a0 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20  ault_expr: .    
288b0 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
288c0 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
288d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
288e0 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
288f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
28900 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65  ( exprAlwaysTrue
28910 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
28920 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
28930 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28940 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
28950 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
28960 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
28970 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
28980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28990 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
289a0 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
289b0 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ull!=0);.       
289c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
289d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
289e0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
289f0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
28a00 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28a10 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
28a20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
28a30 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
28a40 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
28a50 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
28a60 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
28a70 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
28a80 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a  regFree2);.}../*
28a90 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33  .** Like sqlite3
28aa0 45 78 70 72 49 66 46 61 6c 73 65 28 29 20 65 78  ExprIfFalse() ex
28ab0 63 65 70 74 20 74 68 61 74 20 61 20 63 6f 70 79  cept that a copy
28ac0 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70   is made of pExp
28ad0 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65  r before.** code
28ae0 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64   generation, and
28af0 20 74 68 61 74 20 63 6f 70 79 20 69 73 20 64 65   that copy is de
28b00 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f 64 65  leted after code
28b10 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69   generation. Thi
28b20 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61  s.** ensures tha
28b30 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
28b40 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65  Expr is unchange
28b50 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
28b60 65 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70  e3ExprIfFalseDup
28b70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
28b80 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
28b90 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66   dest,int jumpIf
28ba0 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  Null){.  sqlite3
28bb0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
28bc0 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79  b;.  Expr *pCopy
28bd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
28be0 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
28bf0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
28c00 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
28c10 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
28c20 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f  alse(pParse, pCo
28c30 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  py, dest, jumpIf
28c40 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Null);.  }.  sql
28c50 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
28c60 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a  b, pCopy);.}../*
28c70 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
28c80 56 61 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  Var is guarantee
28c90 64 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 20 76  d to be an SQL v
28ca0 61 72 69 61 62 6c 65 2e 20 70 45 78 70 72 20 6d  ariable. pExpr m
28cb0 61 79 20 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70  ay be any.** typ
28cc0 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2e  e of expression.
28cd0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
28ce0 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20  is a simple SQL 
28cf0 76 61 6c 75 65 20 2d 20 61 6e 20 69 6e 74 65 67  value - an integ
28d00 65 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67  er, real, string
28d10 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c  , blob.** or NUL
28d20 4c 20 76 61 6c 75 65 20 2d 20 74 68 65 6e 20 74  L value - then t
28d30 68 65 20 56 44 42 45 20 63 75 72 72 65 6e 74 6c  he VDBE currentl
28d40 79 20 62 65 69 6e 67 20 70 72 65 70 61 72 65 64  y being prepared
28d50 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a   is configured.*
28d60 2a 20 74 6f 20 72 65 2d 70 72 65 70 61 72 65 20  * to re-prepare 
28d70 65 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20  each time a new 
28d80 76 61 6c 75 65 20 69 73 20 62 6f 75 6e 64 20 74  value is bound t
28d90 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2e  o variable pVar.
28da0 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
28db0 6c 6c 79 2c 20 69 66 20 70 45 78 70 72 20 69 73  lly, if pExpr is
28dc0 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61   a simple SQL va
28dd0 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75  lue and the valu
28de0 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65  e is the.** same
28df0 20 61 73 20 74 68 61 74 20 63 75 72 72 65 6e 74   as that current
28e00 6c 79 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69  ly bound to vari
28e10 61 62 6c 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a  able pVar, non-z
28e20 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
28e30 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
28e40 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  f the values are
28e50 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 6f 72   not the same or
28e60 20 69 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74   if pExpr is not
28e70 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c   a simple.** SQL
28e80 20 76 61 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20   value, zero is 
28e90 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
28ea0 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 6d 70  tic int exprComp
28eb0 61 72 65 56 61 72 69 61 62 6c 65 28 50 61 72 73  areVariable(Pars
28ec0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
28ed0 2a 70 56 61 72 2c 20 45 78 70 72 20 2a 70 45 78  *pVar, Expr *pEx
28ee0 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d  pr){.  int res =
28ef0 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a   0;.  int iVar;.
28f00 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
28f10 2a 70 4c 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20  *pL, *pR = 0;.  
28f20 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
28f30 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e  romExpr(pParse->
28f40 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54  db, pExpr, SQLIT
28f50 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 41  E_UTF8, SQLITE_A
28f60 46 46 5f 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20  FF_BLOB, &pR);. 
28f70 20 69 66 28 20 70 52 20 29 7b 0a 20 20 20 20 69   if( pR ){.    i
28f80 56 61 72 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c  Var = pVar->iCol
28f90 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
28fa0 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
28fb0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56  Parse->pVdbe, iV
28fc0 61 72 29 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71  ar);.    pL = sq
28fd0 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
28fe0 64 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70  dValue(pParse->p
28ff0 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c  Reprepare, iVar,
29000 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
29010 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 20 29 7b  );.    if( pL ){
29020 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
29030 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4c  e3_value_type(pL
29040 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  )==SQLITE_TEXT )
29050 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29060 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4c 29  3_value_text(pL)
29070 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ; /* Make sure t
29080 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55  he encoding is U
29090 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  TF-8 */.      }.
290a0 20 20 20 20 20 20 72 65 73 20 3d 20 20 30 3d 3d        res =  0==
290b0 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
290c0 65 28 70 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20  e(pL, pR, 0);.  
290d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
290e0 61 6c 75 65 46 72 65 65 28 70 52 29 3b 0a 20 20  alueFree(pR);.  
290f0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
29100 65 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72  ee(pL);.  }..  r
29110 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
29120 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
29130 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
29140 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
29150 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
29160 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
29170 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65  sions are comple
29180 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20  tely identical. 
29190 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
291a0 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a  y differ only.**
291b0 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70   by a COLLATE op
291c0 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f  erator at the to
291d0 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e  p level.  Return
291e0 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20   2 if there are 
291f0 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f  differences.** o
29200 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f  ther than the to
29210 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20  p-level COLLATE 
29220 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
29230 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e  If any subelemen
29240 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72  t of pB has Expr
29250 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68  .iTable==(-1) th
29260 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64  en it is allowed
29270 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65  .** to compare e
29280 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76  qual to an equiv
29290 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e  alent element in
292a0 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54   pA with Expr.iT
292b0 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a  able==iTab..**.*
292c0 2a 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69  * The pA side mi
292d0 67 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f  ght be using TK_
292e0 52 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68  REGISTER.  If th
292f0 61 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61  at is the case a
29300 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20  nd pB is.** not 
29310 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
29320 52 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  R but is otherwi
29330 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74  se equivalent, t
29340 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
29350 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69   0..**.** Someti
29360 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
29370 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65   will return 2 e
29380 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65  ven if the two e
29390 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65  xpressions.** re
293a0 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c  ally are equival
293b0 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e  ent.  If we cann
293c0 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  ot prove that th
293d0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
293e0 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20  e.** identical, 
293f0 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74  we return 2 just
29400 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f   to be safe.  So
29410 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
29420 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74  .** returns 2, t
29430 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
29440 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
29450 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
29460 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
29470 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
29480 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
29490 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20   0 or 1 return, 
294a0 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
294b0 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
294c0 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
294d0 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
294e0 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
294f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
29500 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
29510 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
29520 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a  xtra 2 - that.**
29530 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75   just might resu
29540 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68  lt in some sligh
29550 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e  tly slower code.
29560 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a    But returning.
29570 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** an incorrect 
29580 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61  0 or 1 could lea
29590 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
295a0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61  on..**.** If pPa
295b0 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  rse is not NULL 
295c0 74 68 65 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45  then TK_VARIABLE
295d0 20 74 65 72 6d 73 20 69 6e 20 70 41 20 77 69 74   terms in pA wit
295e0 68 20 62 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a  h bindings in.**
295f0 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70   pParse->pReprep
29600 61 72 65 20 63 61 6e 20 62 65 20 6d 61 74 63 68  are can be match
29610 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65 72  ed against liter
29620 61 6c 73 20 69 6e 20 70 42 2e 20 20 54 68 65 20  als in pB.  The 
29630 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 56 64 62  .** pParse->pVdb
29640 65 2d 3e 65 78 70 6d 61 73 6b 20 62 69 74 6d 61  e->expmask bitma
29650 73 6b 20 69 73 20 75 70 64 61 74 65 64 20 66 6f  sk is updated fo
29660 72 20 65 61 63 68 20 76 61 72 69 61 62 6c 65 20  r each variable 
29670 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49  referenced..** I
29680 66 20 70 50 61 72 73 65 20 69 73 20 4e 55 4c 4c  f pParse is NULL
29690 20 28 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73   (the normal cas
296a0 65 29 20 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56  e) then any TK_V
296b0 41 52 49 41 42 4c 45 20 74 65 72 6d 20 69 6e 20  ARIABLE term in 
296c0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 50 61  .** Argument pPa
296d0 72 73 65 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  rse should norma
296e0 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20  lly be NULL. If 
296f0 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  it is not NULL a
29700 6e 64 20 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63  nd pA or.** pB c
29710 61 75 73 65 73 20 61 20 72 65 74 75 72 6e 20 76  auses a return v
29720 61 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e  alue of 2..*/.in
29730 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
29740 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  pare(Parse *pPar
29750 73 65 2c 20 45 78 70 72 20 2a 70 41 2c 20 45 78  se, Expr *pA, Ex
29760 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  pr *pB, int iTab
29770 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65  ){.  u32 combine
29780 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41  dFlags;.  if( pA
29790 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a  ==0 || pB==0 ){.
297a0 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
297b0 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20  A ? 0 : 2;.  }. 
297c0 20 69 66 28 20 70 50 61 72 73 65 20 26 26 20 70   if( pParse && p
297d0 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  A->op==TK_VARIAB
297e0 4c 45 20 26 26 20 65 78 70 72 43 6f 6d 70 61 72  LE && exprCompar
297f0 65 56 61 72 69 61 62 6c 65 28 70 50 61 72 73 65  eVariable(pParse
29800 2c 20 70 41 2c 20 70 42 29 20 29 7b 0a 20 20 20  , pA, pB) ){.   
29810 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
29820 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d   combinedFlags =
29830 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d   pA->flags | pB-
29840 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f  >flags;.  if( co
29850 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
29860 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
29870 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26   if( (pA->flags&
29880 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74  pB->flags&EP_Int
29890 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d  Value)!=0 && pA-
298a0 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75  >u.iValue==pB->u
298b0 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  .iValue ){.     
298c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
298d0 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
298e0 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
298f0 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69  =pB->op ){.    i
29900 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
29910 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
29920 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
29930 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42  se, pA->pLeft,pB
29940 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20  ,iTab)<2 ){.    
29950 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
29960 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70  }.    if( pB->op
29970 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
29980 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
29990 72 65 28 70 50 61 72 73 65 2c 20 70 41 2c 70 42  re(pParse, pA,pB
299a0 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29 3c 32 20  ->pLeft,iTab)<2 
299b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
299c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  1;.    }.    ret
299d0 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
299e0 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
299f0 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  MN && pA->op!=TK
29a00 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  _AGG_COLUMN && p
29a10 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  A->u.zToken ){. 
29a20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
29a30 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
29a40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
29a50 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  trICmp(pA->u.zTo
29a60 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
29a70 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b  )!=0 ) return 2;
29a80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
29a90 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b  trcmp(pA->u.zTok
29aa0 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  en,pB->u.zToken)
29ab0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
29ac0 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43  urn pA->op==TK_C
29ad0 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a  OLLATE ? 1 : 2;.
29ae0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
29af0 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
29b00 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e  Distinct)!=(pB->
29b10 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
29b20 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  nct) ) return 2;
29b30 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63  .  if( ALWAYS((c
29b40 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
29b50 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29  P_TokenOnly)==0)
29b60 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62   ){.    if( comb
29b70 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78  inedFlags & EP_x
29b80 49 73 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  IsSelect ) retur
29b90 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
29ba0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
29bb0 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66  pParse, pA->pLef
29bc0 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  t, pB->pLeft, iT
29bd0 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
29be0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
29bf0 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
29c00 65 2c 20 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  e, pA->pRight, p
29c10 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29  B->pRight, iTab)
29c20 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
29c30 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
29c40 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ListCompare(pA->
29c50 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70  x.pList, pB->x.p
29c60 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20 72 65  List, iTab) ) re
29c70 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
29c80 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64  ALWAYS((combined
29c90 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63  Flags & EP_Reduc
29ca0 65 64 29 3d 3d 30 29 20 26 26 20 70 41 2d 3e 6f  ed)==0) && pA->o
29cb0 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p!=TK_STRING ){.
29cc0 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43        if( pA->iC
29cd0 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75  olumn!=pB->iColu
29ce0 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  mn ) return 2;. 
29cf0 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61       if( pA->iTa
29d00 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20  ble!=pB->iTable 
29d10 0a 20 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e  .       && (pA->
29d20 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20  iTable!=iTab || 
29d30 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65  NEVER(pB->iTable
29d40 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20 32  >=0)) ) return 2
29d50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
29d60 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
29d70 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70   Compare two Exp
29d80 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20  rList objects.  
29d90 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 79  Return 0 if they
29da0 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61   are identical a
29db0 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  nd .** non-zero 
29dc0 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69  if they differ i
29dd0 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
29de0 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65   If any subeleme
29df0 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70  nt of pB has Exp
29e00 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74  r.iTable==(-1) t
29e10 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65  hen it is allowe
29e20 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20  d.** to compare 
29e30 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69  equal to an equi
29e40 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69  valent element i
29e50 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69  n pA with Expr.i
29e60 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a  Table==iTab..**.
29e70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29e80 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e  might return non
29e90 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61  -zero for equiva
29ea0 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20  lent ExprLists. 
29eb0 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e   The.** only con
29ec0 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65  sequence will be
29ed0 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69   disabled optimi
29ee0 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  zations.  But th
29ef0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75  is routine.** mu
29f00 73 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20  st never return 
29f10 30 20 69 66 20 74 68 65 20 74 77 6f 20 45 78 70  0 if the two Exp
29f20 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72  rList objects ar
29f30 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a  e different, or.
29f40 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ** a malfunction
29f50 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a   will result..**
29f60 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69  .** Two NULL poi
29f70 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64  nters are consid
29f80 65 72 65 64 20 74 6f 20 62 65 20 74 68 65 20 73  ered to be the s
29f90 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c  ame.  But a NULL
29fa0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61   pointer.** alwa
29fb0 79 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  ys differs from 
29fc0 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74  a non-NULL point
29fd0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
29fe0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
29ff0 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20  e(ExprList *pA, 
2a000 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e  ExprList *pB, in
2a010 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69  t iTab){.  int i
2a020 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26  ;.  if( pA==0 &&
2a030 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pB==0 ) return 
2a040 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c  0;.  if( pA==0 |
2a050 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e  | pB==0 ) return
2a060 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45   1;.  if( pA->nE
2a070 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29  xpr!=pB->nExpr )
2a080 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72   return 1;.  for
2a090 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70  (i=0; i<pA->nExp
2a0a0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
2a0b0 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e  r *pExprA = pA->
2a0c0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
2a0d0 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70  Expr *pExprB = p
2a0e0 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  B->a[i].pExpr;. 
2a0f0 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e     if( pA->a[i].
2a100 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61  sortOrder!=pB->a
2a110 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20  [i].sortOrder ) 
2a120 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
2a130 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2a140 70 61 72 65 28 30 2c 20 70 45 78 70 72 41 2c 20  pare(0, pExprA, 
2a150 70 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20  pExprB, iTab) ) 
2a160 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2a170 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2a180 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45  ** Like sqlite3E
2a190 78 70 72 43 6f 6d 70 61 72 65 28 29 20 65 78 63  xprCompare() exc
2a1a0 65 70 74 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ept COLLATE oper
2a1b0 61 74 6f 72 73 20 61 74 20 74 68 65 20 74 6f 70  ators at the top
2a1c0 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67  -level.** are ig
2a1d0 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
2a1e0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2a1f0 53 6b 69 70 28 45 78 70 72 20 2a 70 41 2c 20 45  Skip(Expr *pA, E
2a200 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61  xpr *pB, int iTa
2a210 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  b){.  return sql
2a220 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2a230 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2a240 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
2a250 6f 6c 6c 61 74 65 28 70 41 29 2c 0a 20 20 20 20  ollate(pA),.    
2a260 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2a270 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2a280 70 42 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pB),.           
2a290 20 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a    iTab);.}../*.*
2a2a0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2a2b0 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68   we can prove th
2a2c0 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79  e pE2 will alway
2a2d0 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31  s be true if pE1
2a2e0 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65   is.** true.  Re
2a2f0 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65  turn false if we
2a300 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   cannot complete
2a310 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66   the proof or if
2a320 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65   pE2 might.** be
2a330 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65   false.  Example
2a340 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31  s:.**.**     pE1
2a350 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32  : x==5       pE2
2a360 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
2a370 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
2a380 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20  **     pE1: x>0 
2a390 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35         pE2: x==5
2a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
2a3b0 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
2a3c0 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20    pE1: x=21     
2a3d0 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79    pE2: x=21 OR y
2a3e0 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20  =43     Result: 
2a3f0 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
2a400 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a   x!=123     pE2:
2a410 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
2a420 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
2a430 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31  *     pE1: x!=?1
2a440 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20        pE2: x IS 
2a450 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
2a460 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
2a470 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20  pE1: x IS NULL  
2a480 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
2a490 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61  LL    Result: fa
2a4a0 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
2a4b0 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20  x IS ?2    pE2: 
2a4c0 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
2a4d0 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a   Reuslt: false.*
2a4e0 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72  *.** When compar
2a4f0 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ing TK_COLUMN no
2a500 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20  des between pE1 
2a510 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20  and pE2, if pE2 
2a520 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62  has.** Expr.iTab
2a530 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65  le<0 then assume
2a540 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20   a table number 
2a550 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a  given by iTab..*
2a560 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69  *.** If pParse i
2a570 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
2a580 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62   the values of b
2a590 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20 69  ound variables i
2a5a0 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f  n pE1 are .** co
2a5b0 6d 70 61 72 65 64 20 61 67 61 69 6e 73 74 20 6c  mpared against l
2a5c0 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20 69 6e  iteral values in
2a5d0 20 70 45 32 20 61 6e 64 20 70 50 61 72 73 65 2d   pE2 and pParse-
2a5e0 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20  >pVdbe->expmask 
2a5f0 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74  is.** modified t
2a600 6f 20 72 65 63 6f 72 64 20 77 68 69 63 68 20 62  o record which b
2a610 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20 61  ound variables a
2a620 72 65 20 72 65 66 65 72 65 6e 63 65 64 2e 20 20  re referenced.  
2a630 49 66 20 70 50 61 72 73 65 20 0a 2a 2a 20 69 73  If pParse .** is
2a640 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73   NULL, then fals
2a650 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  e will be return
2a660 65 64 20 69 66 20 70 45 31 20 63 6f 6e 74 61 69  ed if pE1 contai
2a670 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20 76 61 72  ns any bound var
2a680 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  iables..**.** Wh
2a690 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
2a6a0 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75  urn false.  Retu
2a6b0 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74  rning true might
2a6c0 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
2a6d0 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65  nce.** improveme
2a6e0 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66  nt.  Returning f
2a6f0 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73 65  alse might cause
2a700 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72   a performance r
2a710 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  eduction, but.**
2a720 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20   it will always 
2a730 67 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74  give the correct
2a740 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68   answer and is h
2a750 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66 65  ence always safe
2a760 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a770 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
2a780 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
2a790 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a  xpr *pE1, Expr *
2a7a0 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  pE2, int iTab){.
2a7b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2a7c0 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
2a7d0 20 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29   pE1, pE2, iTab)
2a7e0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2a7f0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
2a800 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20  E2->op==TK_OR.  
2a810 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72   && (sqlite3Expr
2a820 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50 61 72  ImpliesExpr(pPar
2a830 73 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c  se, pE1, pE2->pL
2a840 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20  eft, iTab).     
2a850 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2a860 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
2a870 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70  r(pParse, pE1, p
2a880 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  E2->pRight, iTab
2a890 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ) ).  ){.    ret
2a8a0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2a8b0 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54   pE2->op==TK_NOT
2a8c0 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21  NULL && pE1->op!
2a8d0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45  =TK_ISNULL && pE
2a8e0 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a  1->op!=TK_IS ){.
2a8f0 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 73      Expr *pX = s
2a900 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
2a910 6c 6c 61 74 65 28 70 45 31 2d 3e 70 4c 65 66 74  llate(pE1->pLeft
2a920 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2a930 20 70 58 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20   pX!=pE1->pLeft 
2a940 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
2a950 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2a960 61 72 73 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70  arse, pX, pE2->p
2a970 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 20 29  Left, iTab)==0 )
2a980 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
2a990 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2a9a0 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2a9b0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2a9c0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
2a9d0 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77  ed by the tree w
2a9e0 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65  alker.** to dete
2a9f0 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72  rmine if an expr
2aa00 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 65 76  ession can be ev
2aa10 61 6c 75 61 74 65 64 20 62 79 20 72 65 66 65 72  aluated by refer
2aa20 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69  ence to the.** i
2aa30 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f  ndex only, witho
2aa40 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20  ut having to do 
2aa50 61 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  a search for the
2aa60 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
2aa70 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 20  * table entry.  
2aa80 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70 49 64  The IdxCover.pId
2aa90 78 20 66 69 65 6c 64 20 69 73 20 74 68 65 20 69  x field is the i
2aaa0 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65 72 2e  ndex.  IdxCover.
2aab0 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65 20 63  iCur.** is the c
2aac0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
2aad0 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49  ble..*/.struct I
2aae0 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65  dxCover {.  Inde
2aaf0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20  x *pIdx;     /* 
2ab00 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
2ab10 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76 65 72  tested for cover
2ab20 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  age */.  int iCu
2ab30 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  r;        /* Cur
2ab40 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
2ab50 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
2ab60 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
2ab70 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  dex */.};../*.**
2ab80 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2ab90 20 74 68 65 72 65 20 61 72 65 20 72 65 66 65 72   there are refer
2aba0 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2abb0 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57   in table .** pW
2abc0 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
2abd0 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62 65 20  er->iCur can be 
2abe0 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
2abf0 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61  the index.** pWa
2ac00 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2ac10 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  r->pIdx..*/.stat
2ac20 69 63 20 69 6e 74 20 65 78 70 72 49 64 78 43 6f  ic int exprIdxCo
2ac30 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ver(Walker *pWal
2ac40 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2ac50 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ){.  if( pExpr->
2ac60 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
2ac70 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
2ac80 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  e==pWalker->u.pI
2ac90 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20  dxCover->iCur.  
2aca0 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d   && sqlite3Colum
2acb0 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b 65 72  nOfIndex(pWalker
2acc0 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70  ->u.pIdxCover->p
2acd0 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  Idx, pExpr->iCol
2ace0 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20  umn)<0.  ){.    
2acf0 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
2ad00 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   1;.    return W
2ad10 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
2ad20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2ad30 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  nue;.}../*.** De
2ad40 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e  termine if an in
2ad50 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c  dex pIdx on tabl
2ad60 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43  e with cursor iC
2ad70 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c  ur contains will
2ad80 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
2ad90 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74 75 72  on pExpr.  Retur
2ada0 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 6e  n true if the in
2adb0 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74  dex does cover t
2adc0 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2add0 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
2ade0 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
2adf0 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 61  on references ta
2ae00 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74  ble columns.** t
2ae10 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e  hat are not foun
2ae20 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70  d in the index p
2ae30 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  Idx..**.** An in
2ae40 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20  dex covering an 
2ae50 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73  expression means
2ae60 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
2ae70 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65  sion can be.** e
2ae80 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f  valuated using o
2ae90 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e  nly the index an
2aea0 64 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  d without having
2aeb0 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a   to lookup the.*
2aec0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
2aed0 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a  table entry..*/.
2aee0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
2aef0 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20  overedByIndex(. 
2af00 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
2af10 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2af20 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a  x to be tested *
2af30 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
2af40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2af50 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
2af60 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2af70 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e  ng table */.  In
2af80 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2af90 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
2afa0 68 61 74 20 6d 69 67 68 74 20 62 65 20 75 73 65  hat might be use
2afb0 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a  d for coverage *
2afc0 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  /.){.  Walker w;
2afd0 0a 20 20 73 74 72 75 63 74 20 49 64 78 43 6f 76  .  struct IdxCov
2afe0 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65  er xcov;.  memse
2aff0 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
2b000 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72  w));.  xcov.iCur
2b010 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e   = iCur;.  xcov.
2b020 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77  pIdx = pIdx;.  w
2b030 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2b040 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20   exprIdxCover;. 
2b050 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d   w.u.pIdxCover =
2b060 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65   &xcov;.  sqlite
2b070 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
2b080 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21  xpr);.  return !
2b090 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  w.eCode;.}.../*.
2b0a0 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
2b0b0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2b0c0 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
2b0d0 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61  d by the tree wa
2b0e0 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74  lker.** to count
2b0f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2b100 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  able columns in 
2b110 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66  the arguments of
2b120 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74   an .** aggregat
2b130 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f  e function, in o
2b140 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
2b150 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  t the.** sqlite3
2b160 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28  FunctionThisSrc(
2b170 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
2b180 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a  ruct SrcCount {.
2b190 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2b1a0 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63     /* One partic
2b1b0 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ular FROM clause
2b1c0 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65   in a nested que
2b1d0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69  ry */.  int nThi
2b1e0 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
2b1f0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2b200 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70   to columns in p
2b210 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  SrcList */.  int
2b220 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a   nOther;      /*
2b230 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
2b240 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2b250 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63   in other FROM c
2b260 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lauses */.};../*
2b270 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
2b280 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2b290 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  es to columns..*
2b2a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
2b2b0 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72  rSrcCount(Walker
2b2c0 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2b2d0 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68  *pExpr){.  /* Th
2b2e0 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65  e NEVER() on the
2b2f0 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20   second term is 
2b300 62 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 46  because sqlite3F
2b310 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2b320 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77  rc().  ** is alw
2b330 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72  ays called befor
2b340 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
2b350 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
2b360 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a   and so the.  **
2b370 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65   TK_COLUMNs have
2b380 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
2b390 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f  nverted into TK_
2b3a0 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a  AGG_COLUMN.  If.
2b3b0 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63    ** sqlite3Func
2b3c0 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2b3d0 29 20 69 73 20 75 73 65 64 20 64 69 66 66 65 72  ) is used differ
2b3e0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74  ently in the fut
2b3f0 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45  ure, the.  ** NE
2b400 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20  VER() will need 
2b410 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a  to be removed. *
2b420 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
2b430 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
2b440 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d  NEVER(pExpr->op=
2b450 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
2b460 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2b470 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
2b480 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  t *p = pWalker->
2b490 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20  u.pSrcCount;.   
2b4a0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
2b4b0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e   p->pSrc;.    in
2b4c0 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20  t nSrc = pSrc ? 
2b4d0 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a  pSrc->nSrc : 0;.
2b4e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2b4f0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
2b500 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
2b510 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  le==pSrc->a[i].i
2b520 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
2b530 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
2b540 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  nSrc ){.      p-
2b550 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65  >nThis++;.    }e
2b560 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  lse{.      p->nO
2b570 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ther++;.    }.  
2b580 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2b590 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2b5a0 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
2b5b0 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ny of the argume
2b5c0 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72  nts to the pExpr
2b5d0 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65   Function refere
2b5e0 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e  nce.** pSrcList.
2b5f0 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
2b600 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20   they do.  Also 
2b610 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  return true if t
2b620 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  he function.** h
2b630 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  as no arguments 
2b640 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73  or has only cons
2b650 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
2b660 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
2b670 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65   pExpr.** refere
2b680 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74  nces columns but
2b690 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   not columns of 
2b6a0 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20  tables found in 
2b6b0 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74  pSrcList..*/.int
2b6c0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2b6d0 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72  UsesThisSrc(Expr
2b6e0 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74   *pExpr, SrcList
2b6f0 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57   *pSrcList){.  W
2b700 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
2b710 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a  t SrcCount cnt;.
2b720 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
2b730 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
2b740 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78 45 78 70  TION );.  w.xExp
2b750 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
2b760 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 78 53  SrcCount;.  w.xS
2b770 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2b780 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75  0;.  w.u.pSrcCou
2b790 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74  nt = &cnt;.  cnt
2b7a0 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74  .pSrc = pSrcList
2b7b0 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20  ;.  cnt.nThis = 
2b7c0 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20  0;.  cnt.nOther 
2b7d0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  = 0;.  sqlite3Wa
2b7e0 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70  lkExprList(&w, p
2b7f0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
2b800 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68    return cnt.nTh
2b810 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68  is>0 || cnt.nOth
2b820 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  er==0;.}../*.** 
2b830 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
2b840 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
2b850 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
2b860 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
2b870 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
2b880 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
2b890 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2b8a0 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
2b8b0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2b8c0 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
2b8d0 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  umn(sqlite3 *db,
2b8e0 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
2b8f0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
2b900 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74  fo->aCol = sqlit
2b910 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
2b920 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  .       db,.    
2b930 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a     pInfo->aCol,.
2b940 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
2b950 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20  nfo->aCol[0]),. 
2b960 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
2b970 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69  olumn,.       &i
2b980 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
2b990 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
2b9a0 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
2b9b0 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
2b9c0 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
2b9d0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
2b9e0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
2b9f0 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
2ba00 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2ba10 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
2ba20 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2ba30 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
2ba40 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
2ba50 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
2ba60 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
2ba70 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
2ba80 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
2ba90 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
2baa0 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
2bab0 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
2bac0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
2bad0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
2bae0 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69  nFunc,.       &i
2baf0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
2bb00 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
2bb10 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72  his is the xExpr
2bb20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74  Callback for a t
2bb30 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20  ree walker.  It 
2bb40 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d  is used to.** im
2bb50 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45  plement sqlite3E
2bb60 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2bb70 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
2bb80 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2bb90 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
2bba0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2bbb0 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
2bbc0 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
2bbd0 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a  gregate(Walker *
2bbe0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2bbf0 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
2bc00 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
2bc10 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
2bc20 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
2bc30 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
2bc40 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
2bc50 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
2bc60 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
2bc70 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
2bc80 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20  NC->pAggInfo;.. 
2bc90 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
2bca0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
2bcb0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
2bcc0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
2bcd0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
2bce0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2bcf0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
2bd00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2bd10 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
2bd20 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  LUMN );.      /*
2bd30 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2bd40 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
2bd50 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
2bd60 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
2bd70 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
2bd80 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
2bd90 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
2bda0 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c  if( ALWAYS(pSrcL
2bdb0 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
2bdc0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2bdd0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2bde0 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
2bdf0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2be00 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
2be10 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2be20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2be30 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
2be40 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  l;.          ass
2be50 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2be60 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2be70 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2be80 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
2be90 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
2bea0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2beb0 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
2bec0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
2bed0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
2bee0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
2bef0 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
2bf00 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
2bf10 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
2bf20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2bf30 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
2bf40 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
2bf50 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2bf60 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
2bf70 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
2bf80 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
2bf90 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
2bfa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2bfb0 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
2bfc0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
2bfd0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2bfe0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
2bff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
2c000 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
2c010 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
2c020 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
2c030 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
2c040 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
2c050 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2c060 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
2c070 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
2c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2c090 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
2c0a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
2c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2c0d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c0e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c0f0 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
2c100 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
2c110 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
2c120 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
2c130 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
2c140 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
2c150 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2c160 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
2c170 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
2c180 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
2c190 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
2c1a0 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
2c1b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2c1c0 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
2c1d0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
2c1e0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
2c1f0 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
2c200 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
2c210 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
2c220 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2c230 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c240 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2c250 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
2c260 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
2c270 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
2c280 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2c290 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
2c2a0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
2c2b0 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
2c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
2c2d0 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
2c2e0 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
2c2f0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
2c300 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2c310 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
2c320 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
2c330 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
2c340 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
2c350 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
2c360 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
2c370 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
2c380 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
2c390 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
2c3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c3b0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
2c3c0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
2c3d0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
2c3e0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
2c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2c400 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
2c410 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
2c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c430 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
2c440 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
2c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2c460 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2c470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c480 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c490 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c4a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2c4b0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2c4c0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
2c4d0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
2c4e0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
2c4f0 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
2c500 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
2c510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c530 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
2c540 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
2c550 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
2c560 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
2c570 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
2c580 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
2c590 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
2c5a0 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
2c5b0 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
2c5c0 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
2c5d0 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
2c5e0 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
2c5f0 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
2c600 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
2c610 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
2c620 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
2c630 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2c640 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
2c650 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
2c660 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2c670 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2c680 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
2c690 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
2c6a0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
2c6b0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20  TK_AGG_COLUMN;. 
2c6c0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2c6d0 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b  ->iAgg = (i16)k;
2c6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2c6f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
2c700 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
2c710 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
2c720 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
2c730 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
2c740 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
2c750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2c760 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2c770 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2c780 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
2c790 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e   {.      if( (pN
2c7a0 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
2c7b0 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20  InAggFunc)==0.  
2c7c0 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d       && pWalker-
2c7d0 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45  >walkerDepth==pE
2c7e0 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29  xpr->op2.      )
2c7f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
2c800 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78  ck to see if pEx
2c810 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  pr is a duplicat
2c820 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67  e of another agg
2c830 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20  regate .        
2c840 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ** function that
2c850 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
2c860 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75  he pAggInfo stru
2c870 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f  cture.        */
2c880 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
2c890 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49  AggInfo_func *pI
2c8a0 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  tem = pAggInfo->
2c8b0 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66  aFunc;.        f
2c8c0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
2c8d0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2c8e0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2c8f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2c900 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49  xprCompare(0, pI
2c910 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70  tem->pExpr, pExp
2c920 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  r, -1)==0 ){.   
2c930 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2c940 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c950 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2c960 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e  ( i>=pAggInfo->n
2c970 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
2c980 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72    /* pExpr is or
2c990 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20  iginal.  Make a 
2c9a0 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67  new entry in pAg
2c9b0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20  gInfo->aFunc[]. 
2c9c0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2c9d0 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
2c9e0 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
2c9f0 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64            i = ad
2ca00 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61  dAggInfoFunc(pPa
2ca10 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
2ca20 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
2ca30 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i>=0 ){.      
2ca40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2ca50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2ca60 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2ca70 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ct) );.         
2ca80 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
2ca90 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
2caa0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2cab0 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
2cac0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2cad0 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  tem->iMem = ++pP
2cae0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2caf0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2cb00 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2cb10 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
2cb20 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
2cb30 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
2cb40 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
2cb50 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
2cb60 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2cb70 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
2cb80 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  Token, .        
2cb90 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2cba0 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70  ->x.pList ? pExp
2cbb0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
2cbc0 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a  r : 0, enc, 0);.
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2cbe0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
2cbf0 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  P_Distinct ){.  
2cc00 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2cc10 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70  m->iDistinct = p
2cc20 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2cc30 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
2cc40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2cc50 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
2cc60 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
2cc70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2cc80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2cc90 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72     /* Make pExpr
2cca0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70   point to the ap
2ccb0 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e  propriate pAggIn
2ccc0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72  fo->aFunc[] entr
2ccd0 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  y.        */.   
2cce0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2ccf0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2cd00 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
2cd10 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
2cd20 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74  .        ExprSet
2cd30 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
2cd40 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
2cd50 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
2cd60 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20  iAgg = (i16)i;. 
2cd70 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
2cd80 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
2cd90 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
2cda0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
2cdb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2cdc0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2cdd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
2cde0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2cdf0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2ce00 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  }.static int ana
2ce10 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
2ce20 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70  Select(Walker *p
2ce30 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
2ce40 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53  pSelect){.  UNUS
2ce50 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65  ED_PARAMETER(pSe
2ce60 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72  lect);.  pWalker
2ce70 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b  ->walkerDepth++;
2ce80 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2ce90 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
2cea0 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67   void analyzeAgg
2ceb0 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45  regatesInSelectE
2cec0 6e 64 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nd(Walker *pWalk
2ced0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  er, Select *pSel
2cee0 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ect){.  UNUSED_P
2cef0 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74  ARAMETER(pSelect
2cf00 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61  );.  pWalker->wa
2cf10 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a  lkerDepth--;.}..
2cf20 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
2cf30 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
2cf40 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
2cf50 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2cf60 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
2cf70 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
2cf80 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
2cf90 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
2cfa0 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e  that pNC->pAggIn
2cfb0 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e  fo.** points to.
2cfc0 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74    Additional ent
2cfd0 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e  ries are made on
2cfe0 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a   the AggInfo obj
2cff0 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73  ect as.** necess
2d000 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
2d010 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
2d020 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
2d030 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
2d040 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
2d050 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
2d060 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
2d070 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  es()..*/.void sq
2d080 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2d090 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43  Aggregates(NameC
2d0a0 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
2d0b0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c  r *pExpr){.  Wal
2d0c0 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
2d0d0 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
2d0e0 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77  zeAggregate;.  w
2d0f0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2d100 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2d110 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20  atesInSelect;.  
2d120 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2d130 6b 32 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  k2 = analyzeAggr
2d140 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e  egatesInSelectEn
2d150 64 3b 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70  d;.  w.walkerDep
2d160 74 68 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e  th = 0;.  w.u.pN
2d170 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72  C = pNC;.  asser
2d180 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  t( pNC->pSrcList
2d190 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
2d1a0 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
2d1b0 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  pr);.}../*.** Ca
2d1c0 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ll sqlite3ExprAn
2d1d0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2d1e0 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72  ) for every expr
2d1f0 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20  ession in an.** 
2d200 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
2d210 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
2d220 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
2d230 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2d240 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61   is found, the a
2d250 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73  nalysis is cut s
2d260 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hort..*/.void sq
2d270 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2d280 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74  AggList(NameCont
2d290 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69  ext *pNC, ExprLi
2d2a0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74  st *pList){.  st
2d2b0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2d2c0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
2d2d0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   i;.  if( pList 
2d2e0 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d  ){.    for(pItem
2d2f0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
2d300 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
2d310 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2d320 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2d330 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2d340 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45  s(pNC, pItem->pE
2d350 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
2d360 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2d370 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72  e a single new r
2d380 65 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20  egister for use 
2d390 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74  to hold some int
2d3a0 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
2d3b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d3c0 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65  GetTempReg(Parse
2d3d0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
2d3e0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2d3f0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  g==0 ){.    retu
2d400 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65  rn ++pParse->nMe
2d410 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  m;.  }.  return 
2d420 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2d430 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  [--pParse->nTemp
2d440 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Reg];.}../*.** D
2d450 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69  eallocate a regi
2d460 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61  ster, making ava
2d470 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
2d480 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a   for some other.
2d490 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a  ** purpose..**.*
2d4a0 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
2d4b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  is currently bei
2d4c0 6e 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ng used by the c
2d4d0 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65  olumn cache, the
2d4e0 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c 6c 6f 63  n.** the dealloc
2d4f0 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65  ation is deferre
2d500 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75  d until the colu
2d510 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68  mn cache line th
2d520 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72  at uses.** the r
2d530 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20  egister becomes 
2d540 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  stale..*/.void s
2d550 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2d560 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
2d570 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  se, int iReg){. 
2d580 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61   if( iReg && pPa
2d590 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
2d5a0 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
2d5b0 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20  aTempReg) ){.   
2d5c0 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
2d5d0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
2d5e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  .    for(i=0, p=
2d5f0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
2d600 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e; i<pParse->nCo
2d610 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b  lCache; i++, p++
2d620 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
2d630 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
2d640 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
2d650 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
2d660 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
2d670 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
2d680 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
2d690 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69  >nTempReg++] = i
2d6a0 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
2d6b0 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65  * Allocate or de
2d6c0 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b  allocate a block
2d6d0 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75   of nReg consecu
2d6e0 74 69 76 65 20 72 65 67 69 73 74 65 72 73 2e 0a  tive registers..
2d6f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2d700 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  tTempRange(Parse
2d710 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52   *pParse, int nR
2d720 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  eg){.  int i, n;
2d730 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29  .  if( nReg==1 )
2d740 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47   return sqlite3G
2d750 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2d760 29 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  );.  i = pParse-
2d770 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
2d780 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
2d790 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
2d7a0 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =n ){.    assert
2d7b0 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  ( !usedAsColumnC
2d7c0 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20  ache(pParse, i, 
2d7d0 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50  i+n-1) );.    pP
2d7e0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2d7f0 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61  += nReg;.    pPa
2d800 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d  rse->nRangeReg -
2d810 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  = nReg;.  }else{
2d820 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d  .    i = pParse-
2d830 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
2d840 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
2d850 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
2d860 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  i;.}.void sqlite
2d870 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2d880 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2d890 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
2d8a0 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67  Reg){.  if( nReg
2d8b0 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
2d8c0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
2d8d0 28 70 50 61 72 73 65 2c 20 69 52 65 67 29 3b 0a  (pParse, iReg);.
2d8e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2d8f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2d900 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
2d910 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20   iReg, nReg);.  
2d920 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d  if( nReg>pParse-
2d930 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20  >nRangeReg ){.  
2d940 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
2d950 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  Reg = nReg;.    
2d960 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2d970 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  g = iReg;.  }.}.
2d980 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20  ./*.** Mark all 
2d990 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
2d9a0 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61  ers as being una
2d9b0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
2d9c0 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
2d9d0 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
2d9e0 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
2d9f0 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  se){.  pParse->n
2da00 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70  TempReg = 0;.  p
2da10 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2da20 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56   = 0;.}../*.** V
2da30 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e 6f 20  alidate that no 
2da40 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
2da50 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 20  er falls within 
2da60 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20  the range of.** 
2da70 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69  iFirst..iLast, i
2da80 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69 73 20  nclusive.  This 
2da90 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
2daa0 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e  call from within
2dab0 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61   assert().** sta
2dac0 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64  tements..*/.#ifd
2dad0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2dae0 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d  int sqlite3NoTem
2daf0 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73 65 20  psInRange(Parse 
2db00 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 69  *pParse, int iFi
2db10 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b  rst, int iLast){
2db20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2db30 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2db40 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72 73 65  g>0.   && pParse
2db50 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50 61 72  ->iRangeReg+pPar
2db60 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3e 20  se->nRangeReg > 
2db70 69 46 69 72 73 74 0a 20 20 20 26 26 20 70 50 61  iFirst.   && pPa
2db80 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3c  rse->iRangeReg <
2db90 3d 20 69 4c 61 73 74 0a 20 20 29 7b 0a 20 20 20  = iLast.  ){.   
2dba0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2dbb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
2dbc0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69  rse->nTempReg; i
2dbd0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
2dbe0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d  rse->aTempReg[i]
2dbf0 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50 61 72  >=iFirst && pPar
2dc00 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c  se->aTempReg[i]<
2dc10 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  =iLast ){.      
2dc20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
2dc30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
2dc40 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2dc50 54 45 5f 44 45 42 55 47 20 2a 2f 0a              TE_DEBUG */.