/ Hex Artifact Content
Login

Artifact 4a555ff68084360c133c5b9d985ae05d2cf914125d4c8e5614496dc071d318dd:


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 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f  if( (op==TK_AGG_
1230: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
1240: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
1250: 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    || op==TK_REGI
1260: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54  STER || op==TK_T
1270: 52 49 47 47 45 52 29 0a 20 20 20 20 20 26 26 20  RIGGER).     && 
1280: 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20 29  p->pTab!=0.    )
1290: 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54  {.      /* op==T
12a0: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
12b0: 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73  >pTab!=0 happens
12c0: 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20   when pExpr was 
12d0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20  originally.     
12e0: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
12f0: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
1300: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
1310: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
1320: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  ister */.      i
1330: 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  nt j = p->iColum
1340: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d  n;.      if( j>=
1350: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
1360: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
1370: 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a   p->pTab->aCol[j
1380: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
1390: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
13a0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
13b0: 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
13c0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13e0: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
13f0: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1400: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1410: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1420: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1430: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1440: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1450: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1460: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
1470: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
1480: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
1490: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
14a0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
14b0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      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 72 31 20 3d 20 65 78 70   );.    r1 = exp
4db0: 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28  rVectorRegister(
4dc0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 69  pParse, pLeft, i
4dd0: 2c 20 72 65 67 4c 65 66 74 2c 20 26 70 4c 2c 20  , regLeft, &pL, 
4de0: 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
4df0: 72 32 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52  r2 = exprVectorR
4e00: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
4e10: 70 52 69 67 68 74 2c 20 69 2c 20 72 65 67 52 69  pRight, i, regRi
4e20: 67 68 74 2c 20 26 70 52 2c 20 26 72 65 67 46 72  ght, &pR, &regFr
4e30: 65 65 32 29 3b 0a 20 20 20 20 63 6f 64 65 43 6f  ee2);.    codeCo
4e40: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
4e50: 2c 20 70 52 2c 20 6f 70 78 2c 20 72 31 2c 20 72  , pR, opx, r1, r
4e60: 32 2c 20 64 65 73 74 2c 20 70 35 29 3b 0a 20 20  2, dest, p5);.  
4e70: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
4e80: 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
4e90: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
4ea0: 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  t);.    testcase
4eb0: 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
4ec0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4ed0: 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 74 65  ==OP_Le);.    te
4ee0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
4ef0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4f00: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
4f10: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4f20: 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
4f30: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f40: 5f 47 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Ge);.    testca
4f50: 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
4f60: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f70: 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
4f80: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f90: 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ne); VdbeCoverag
4fa0: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29  eIf(v,op==OP_Ne)
4fb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
4fc0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
4fd0: 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
4fe0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4ff0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5000: 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20   regFree2);.    
5010: 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 31 20 29  if( i==nLeft-1 )
5020: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
5030: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 78     }.    if( opx
5040: 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 20  ==TK_EQ ){.     
5050: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5060: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
5070: 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b  dest, addrDone);
5080: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5090: 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d 20 53 51  ;.      p5 |= SQ
50a0: 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20  LITE_KEEPNULL;. 
50b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 78     }else if( opx
50c0: 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20 20 20 20 20  ==TK_NE ){.     
50d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
50e0: 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 64 65 73  p2(v, OP_If, des
50f0: 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56 64  t, addrDone); Vd
5100: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5110: 20 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54       p5 |= SQLIT
5120: 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20  E_KEEPNULL;.    
5130: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
5140: 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c  ert( op==TK_LT |
5150: 7c 20 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f  | op==TK_GT || o
5160: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p==TK_LE || op==
5170: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 73  TK_GE );.      s
5180: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5190: 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71  (v, OP_ElseNotEq
51a0: 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a  , 0, addrDone);.
51b0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
51c0: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
51d0: 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
51e0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
51f0: 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_GT);.      Vd
5200: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
5210: 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20  op==TK_LE);.    
5220: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
5230: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a  (v, op==TK_GE);.
5240: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65        if( i==nLe
5250: 66 74 2d 32 20 29 20 6f 70 78 20 3d 20 6f 70 3b  ft-2 ) opx = op;
5260: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
5270: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
5280: 61 62 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e 65  abel(v, addrDone
5290: 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  );.}..#if SQLITE
52a0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
52b0: 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  0./*.** Check th
52c0: 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69  at argument nHei
52d0: 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ght is less than
52e0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
52f0: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72   maximum.** expr
5300: 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c  ession depth all
5310: 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  owed. If it is n
5320: 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ot, leave an err
5330: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a  or message in.**
5340: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20   pParse..*/.int 
5350: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
5360: 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50  Height(Parse *pP
5370: 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68  arse, int nHeigh
5380: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
5390: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
53a0: 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73  mxHeight = pPars
53b0: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
53c0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
53d0: 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48  DEPTH];.  if( nH
53e0: 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29  eight>mxHeight )
53f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5400: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
5410: 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f        "Expressio
5420: 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61  n tree is too la
5430: 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70  rge (maximum dep
5440: 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68  th %d)", mxHeigh
5450: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20  t.    );.    rc 
5460: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
5470: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5480: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  .}../* The follo
5490: 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74  wing three funct
54a0: 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78  ions, heightOfEx
54b0: 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78  pr(), heightOfEx
54c0: 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20  prList().** and 
54d0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29  heightOfSelect()
54e0: 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65  , are used to de
54f0: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69  termine the maxi
5500: 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66  mum height.** of
5510: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
5520: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20  tree referenced 
5530: 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  by the structure
5540: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
5550: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
5560: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
5570: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69  maximum height i
5580: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
5590: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
55a0: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
55b0: 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20  y pnHeight, the 
55c0: 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
55d0: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65  , then set *pnHe
55e0: 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  ight to that.** 
55f0: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
5600: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
5610: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
5620: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
5630: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
5640: 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69  ->nHeight>*pnHei
5650: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  ght ){.      *pn
5660: 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69  Height = p->nHei
5670: 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ght;.    }.  }.}
5680: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5690: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78  ghtOfExprList(Ex
56a0: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a  prList *p, int *
56b0: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
56c0: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
56d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
56e0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  p->nExpr; i++){.
56f0: 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78        heightOfEx
5700: 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pr(p->a[i].pExpr
5710: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5720: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5730: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c  void heightOfSel
5740: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 53 65 6c  ect(Select *pSel
5750: 65 63 74 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67  ect, int *pnHeig
5760: 68 74 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ht){.  Select *p
5770: 3b 0a 20 20 66 6f 72 28 70 3d 70 53 65 6c 65 63  ;.  for(p=pSelec
5780: 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f  t; p; p=p->pPrio
5790: 72 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  r){.    heightOf
57a0: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
57b0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
57c0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
57d0: 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74  Having, pnHeight
57e0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
57f0: 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70  xpr(p->pLimit, p
5800: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5810: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5820: 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67  ->pEList, pnHeig
5830: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5840: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  fExprList(p->pGr
5850: 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29  oupBy, 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 4f 72 64 65 72  prList(p->pOrder
5880: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
5890: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
58a0: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
58b0: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
58c0: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
58d0: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
58e0: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
58f0: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
5900: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
5910: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
5920: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
5930: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
5940: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
5950: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
5960: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
5970: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
5980: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
5990: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
59a0: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a   plus one..**.**
59b0: 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20   Also propagate 
59c0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
59d0: 67 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e  gs up from Expr.
59e0: 78 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e  x.pList to Expr.
59f0: 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70  flags,.** if app
5a00: 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
5a10: 74 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74  tic void exprSet
5a20: 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b  Height(Expr *p){
5a30: 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d  .  int nHeight =
5a40: 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78   0;.  heightOfEx
5a50: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48  pr(p->pLeft, &nH
5a60: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
5a70: 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  OfExpr(p->pRight
5a80: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69  , &nHeight);.  i
5a90: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
5aa0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
5ab0: 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ct) ){.    heigh
5ac0: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70  tOfSelect(p->x.p
5ad0: 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74  Select, &nHeight
5ae0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
5af0: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
5b00: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5b10: 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  t(p->x.pList, &n
5b20: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e  Height);.    p->
5b30: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
5b40: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
5b50: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
5b60: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  x.pList);.  }.  
5b70: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
5b80: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
5b90: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
5ba0: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
5bb0: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
5bc0: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
5bd0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
5be0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
5bf0: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
5c00: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
5c10: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
5c20: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
5c30: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   pParse..**.** A
5c40: 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c  lso propagate al
5c50: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
5c60: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
5c70: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
5c80: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
5c90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
5ca0: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
5cb0: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
5cc0: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
5cd0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
5ce0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70   ) return;.  exp
5cf0: 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20  rSetHeight(p);. 
5d00: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
5d10: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
5d20: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a  p->nHeight);.}..
5d30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5d40: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
5d50: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
5d60: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
5d70: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65  d.** by the sele
5d80: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
5d90: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
5da0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
5db0: 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
5dc0: 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ht(Select *p){. 
5dd0: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
5de0: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
5df0: 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b  ct(p, &nHeight);
5e00: 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68  .  return nHeigh
5e10: 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42  t;.}.#else /* AB
5e20: 4f 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66  OVE:  Height enf
5e30: 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64  orcement enabled
5e40: 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74  .  BELOW: Height
5e50: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66   enforcement off
5e60: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67   */./*.** Propag
5e70: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5e80: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5e90: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5ea0: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
5eb0: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
5ec0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
5ed0: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
5ee0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5ef0: 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
5f00: 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78  ->x.pList && !Ex
5f10: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5f20: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
5f30: 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  {.    p->flags |
5f40: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
5f50: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5f60: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
5f70: 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  );.  }.}.#define
5f80: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
5f90: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
5fa0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
5fb0: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
5fc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
5fd0: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
5fe0: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
5ff0: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
6000: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
6010: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
6020: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
6030: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
6040: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
6050: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
6060: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
6070: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
6080: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
6090: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
60a0: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
60b0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
60c0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
60d0: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
60e0: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
60f0: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
6100: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
6110: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
6120: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
6130: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
6140: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
6150: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
6160: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  ting is performe
6170: 64 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  d.  The deQuote.
6180: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
6190: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
61a0: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
61b0: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
61c0: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
61d0: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
61e0: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
61f0: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
6200: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
6210: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
6220: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
6230: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
6240: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
6250: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
6260: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
6270: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
6280: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
6290: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
62a0: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
62b0: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
62c0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
62d0: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
62e0: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
62f0: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
6300: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
6310: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
6320: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
6330: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
6340: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
6350: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
6360: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
6370: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
6380: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
6390: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
63a0: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
63b0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
63c0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
63e0: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
63f0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29  3DbMallocRawNN()
6400: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6420: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6430: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  de */.  const To
6440: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20  ken *pToken,    
6450: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
6460: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
6470: 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  L */.  int dequo
6480: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
6490: 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74  * True to dequot
64a0: 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  e */.){.  Expr *
64b0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74  pNew;.  int nExt
64c0: 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  ra = 0;.  int iV
64d0: 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  alue = 0;..  ass
64e0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
64f0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
6500: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
6510: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
6520: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
6530: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
6540: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
6550: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
6560: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
6570: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  n->n+1;.      as
6580: 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20  sert( iValue>=0 
6590: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
65a0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
65b0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
65c0: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
65d0: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
65e0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e  ){.    memset(pN
65f0: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ew, 0, sizeof(Ex
6600: 70 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pr));.    pNew->
6610: 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20  op = (u8)op;.   
6620: 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31   pNew->iAgg = -1
6630: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e  ;.    if( pToken
6640: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45   ){.      if( nE
6650: 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xtra==0 ){.     
6660: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
6670: 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  = EP_IntValue|EP
6680: 5f 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 70  _Leaf;.        p
6690: 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
66a0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65  iValue;.      }e
66b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
66c0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
66d0: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
66e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
66f0: 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70  Token->z!=0 || p
6700: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20  Token->n==0 );. 
6710: 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65         if( pToke
6720: 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e  n->n ) memcpy(pN
6730: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54  ew->u.zToken, pT
6740: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
6750: 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  >n);.        pNe
6760: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b  w->u.zToken[pTok
6770: 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  en->n] = 0;.    
6780: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
6790: 26 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74  && sqlite3Isquot
67a0: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
67b0: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
67c0: 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54    if( pNew->u.zT
67d0: 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70  oken[0]=='"' ) p
67e0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
67f0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
6800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
6810: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
6820: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ken);.        }.
6830: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
6840: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
6850: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
6860: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
6870: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
6880: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
6890: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
68a0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
68b0: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
68c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
68d0: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
68e0: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
68f0: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
6900: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
6910: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6920: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
6930: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6940: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6950: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
6960: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6970: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6980: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6990: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
69a0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
69b0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
69c0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
69d0: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
69e0: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
69f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6a00: 28 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75  (zToken);.  retu
6a10: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
6a20: 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20  loc(db, op, &x, 
6a30: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  0);.}../*.** Att
6a40: 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65  ach subtrees pLe
6a50: 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f  ft and pRight to
6a60: 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70   the Expr node p
6a70: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  Root..**.** If p
6a80: 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Root==NULL that 
6a90: 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d  means that a mem
6aa0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
6ab0: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
6ac0: 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61  d..** In that ca
6ad0: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73  se, delete the s
6ae0: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
6af0: 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69  d pRight..*/.voi
6b00: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74  d sqlite3ExprAtt
6b10: 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73  achSubtrees(.  s
6b20: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78  qlite3 *db,.  Ex
6b30: 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70  pr *pRoot,.  Exp
6b40: 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72  r *pLeft,.  Expr
6b50: 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66   *pRight.){.  if
6b60: 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( pRoot==0 ){.  
6b70: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
6b80: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6b90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6ba0: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
6bb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6bc0: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
6bd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6be0: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
6bf0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68      pRoot->pRigh
6c00: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
6c10: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
6c20: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
6c30: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a   pRight->flags;.
6c40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
6c50: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  eft ){.      pRo
6c60: 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66  ot->pLeft = pLef
6c70: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6c80: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6c90: 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66  agate & pLeft->f
6ca0: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lags;.    }.    
6cb0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52  exprSetHeight(pR
6cc0: 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oot);.  }.}../*.
6cd0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45  ** Allocate an E
6ce0: 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a  xpr node which j
6cf0: 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20  oins as many as 
6d00: 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a  two subtrees..**
6d10: 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20  .** One or both 
6d20: 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20  of the subtrees 
6d30: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65  can be NULL.  Re
6d40: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6d50: 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70  o the new.** Exp
6d60: 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20  r node.  Or, if 
6d70: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
6d80: 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d  urs, set pParse-
6d90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6da0: 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73  d,.** free the s
6db0: 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75  ubtrees and retu
6dc0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72  rn NULL..*/.Expr
6dd0: 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a   *sqlite3PExpr(.
6de0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
6e00: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6e10: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
6e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
6e30: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
6e40: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6e60: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
6e70: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 20 20   Expr *pRight   
6e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
6e90: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a  t operand */.){.
6ea0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28    Expr *p;.  if(
6eb0: 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70   op==TK_AND && p
6ec0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
6ed0: 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 64  {.    /* Take ad
6ee0: 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72 74  vantage of short
6ef0: 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65 20 6f  -circuit false o
6f00: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
6f10: 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73  AND */.    p = s
6f20: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
6f30: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c  arse->db, pLeft,
6f40: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
6f50: 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e{.    p = sqlit
6f60: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
6f70: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
6f80: 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 69  of(Expr));.    i
6f90: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  f( p ){.      me
6fa0: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
6fb0: 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 20 20  f(Expr));.      
6fc0: 70 2d 3e 6f 70 20 3d 20 6f 70 20 26 20 54 4b 46  p->op = op & TKF
6fd0: 4c 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 70  LG_MASK;.      p
6fe0: 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20  ->iAgg = -1;.   
6ff0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
7000: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
7010: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20  (pParse->db, p, 
7020: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
7030: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a    }.  if( p ) {.
7040: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7050: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
7060: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
7070: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
7080: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65  }../*.** Add pSe
7090: 6c 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72  lect to the Expr
70a0: 2e 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64  .x.pSelect field
70b0: 2e 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20  .  Or, if pExpr 
70c0: 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20  is NULL (due.** 
70d0: 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  do a memory allo
70e0: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20  cation failure) 
70f0: 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
7100: 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a  pSelect object..
7110: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
7120: 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61  ExprAddSelect(Pa
7130: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
7140: 72 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74  r *pExpr, Select
7150: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66   *pSelect){.  if
7160: 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ( pExpr ){.    p
7170: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
7180: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45  = pSelect;.    E
7190: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
71a0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
71b0: 63 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b  ct|EP_Subquery);
71c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
71d0: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
71e0: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  s(pParse, pExpr)
71f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7200: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
7210: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7220: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
7230: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
7240: 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  e->db, pSelect);
7250: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  .  }.}.../*.** I
7260: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
7270: 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
7280: 72 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20  r TRUE or FALSE 
7290: 28 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a  (respectively),.
72a0: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31  ** then return 1
72b0: 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  .  If one cannot
72c0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74   determine the t
72d0: 72 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68  ruth value of th
72e0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
72f0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
7300: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
7310: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
7320: 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20  ization.  If is 
7330: 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68  OK to return 0 h
7340: 65 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74  ere even if.** t
7350: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
7360: 61 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66  ally is always f
7370: 61 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61  alse or false (a
7380: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29   false negative)
7390: 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61  ..** But it is a
73a0: 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31   bug to return 1
73b0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
73c0: 6f 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69  on might have di
73d0: 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65  fferent.** boole
73e0: 61 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66  an values in dif
73f0: 66 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61  ferent circumsta
7400: 6e 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f  nces (a false po
7410: 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e  sitive.).**.** N
7420: 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20  ote that if the 
7430: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61  expression is pa
7440: 72 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61  rt of conditiona
7450: 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20  l for a.** LEFT 
7460: 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61  JOIN, then we ca
7470: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61  nnot determine a
7480: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
7490: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
74a0: 20 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66   is it true or f
74b0: 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20  alse, so always 
74c0: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
74d0: 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61  tic int exprAlwa
74e0: 79 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b  ysTrue(Expr *p){
74f0: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
7500: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
7510: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
7520: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
7530: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
7540: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
7550: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
7560: 20 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a   return v!=0;.}.
7570: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
7580: 6c 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20  lwaysFalse(Expr 
7590: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
75a0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
75b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
75c0: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
75d0: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
75e0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
75f0: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
7600: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30  0;.  return v==0
7610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
7620: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
7630: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
7640: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
7650: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
7660: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
7670: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
7680: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
7690: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64  **.** If one sid
76a0: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
76b0: 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f  f the AND is kno
76c0: 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20  wn to be false, 
76d0: 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20  then instead.** 
76e0: 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  of returning an 
76f0: 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  AND expression, 
7700: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
7710: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
7720: 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75  n with.** a valu
7730: 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45  e of false..*/.E
7740: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
7750: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
7760: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
7770: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
7780: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
7790: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
77a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
77b0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
77c0: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
77d0: 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
77e0: 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20  aysFalse(pLeft) 
77f0: 7c 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  || exprAlwaysFal
7800: 73 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  se(pRight) ){.  
7810: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7820: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
7830: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7840: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
7850: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
7860: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
7870: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
7880: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
7890: 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  [0], 0);.  }else
78a0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
78b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
78c0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20  loc(db, TK_AND, 
78d0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
78e0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
78f0: 72 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70  rees(db, pNew, p
7900: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
7910: 20 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a     return pNew;.
7920: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
7930: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
7940: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
7950: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
7960: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67   multiple.** arg
7970: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20  uments..*/.Expr 
7980: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63  *sqlite3ExprFunc
7990: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
79a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
79b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
79c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
79d0: 70 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 41  pList,      /* A
79e0: 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a  rgument list */.
79f0: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c    Token *pToken,
7a00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
7a10: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
7a20: 2a 2f 0a 20 20 69 6e 74 20 65 44 69 73 74 69 6e  */.  int eDistin
7a30: 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 46  ct         /* SF
7a40: 5f 44 69 73 74 69 6e 63 74 20 6f 72 20 53 46 5f  _Distinct or SF_
7a50: 41 4c 4c 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20  ALL or 0 */.){. 
7a60: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73   Expr *pNew;.  s
7a70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7a80: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
7a90: 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70  t( pToken );.  p
7aa0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
7ab0: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55  rAlloc(db, TK_FU
7ac0: 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20  NCTION, pToken, 
7ad0: 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  1);.  if( pNew==
7ae0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7af0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
7b00: 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76  b, pList); /* Av
7b10: 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20  oid memory leak 
7b20: 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  when malloc fail
7b30: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
7b40: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
7b50: 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 45 78  st && pList->nEx
7b60: 70 72 20 3e 20 70 50 61 72 73 65 2d 3e 64 62 2d  pr > pParse->db-
7b70: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7b80: 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
7b90: 47 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  G] ){.    sqlite
7ba0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7bb0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75  , "too many argu
7bc0: 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69 6f  ments on functio
7bd0: 6e 20 25 54 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a  n %T", pToken);.
7be0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c    }.  pNew->x.pL
7bf0: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45  ist = pList;.  E
7c00: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
7c10: 4e 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29  New, EP_HasFunc)
7c20: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
7c30: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7c40: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
7c50: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
7c60: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
7c70: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
7c80: 3b 0a 20 20 69 66 28 20 65 44 69 73 74 69 6e 63  ;.  if( eDistinc
7c90: 74 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  t==SF_Distinct )
7ca0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
7cb0: 28 70 4e 65 77 2c 20 45 50 5f 44 69 73 74 69 6e  (pNew, EP_Distin
7cc0: 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ct);.  return pN
7cd0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
7ce0: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
7cf0: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
7d00: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
7d10: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
7d20: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
7d30: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
7d40: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
7d50: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
7d60: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
7d70: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
7d80: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
7d90: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
7da0: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
7db0: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
7dc0: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
7dd0: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
7de0: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
7df0: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
7e00: 6f 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61 76  ot too big to av
7e10: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
7e20: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
7e30: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
7e40: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
7e50: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
7e60: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
7e70: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
7e80: 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61  orm ":aaa", "@aa
7e90: 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72  a", or "$aaa" ar
7ea0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
7eb0: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
7ec0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
7ed0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
7ee0: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
7ef0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
7f00: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
7f10: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
7f20: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
7f30: 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20  ential variable 
7f40: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
7f50: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
7f60: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
7f70: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
7f80: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
7f90: 45 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20  Expr, u32 n){.  
7fa0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7fb0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73  arse->db;.  cons
7fc0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56  t char *z;.  ynV
7fd0: 61 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45 78  ar x;..  if( pEx
7fe0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
7ff0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
8000: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
8010: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  , EP_IntValue|EP
8020: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
8030: 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20  nOnly) );.  z = 
8040: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
8050: 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20  .  assert( z!=0 
8060: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30  );.  assert( z[0
8070: 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ]!=0 );.  assert
8080: 28 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74 65  ( n==(u32)sqlite
8090: 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a  3Strlen30(z) );.
80a0: 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b    if( z[1]==0 ){
80b0: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
80c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22   of the form "?"
80d0: 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65  .  Assign the ne
80e0: 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  xt variable numb
80f0: 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  er */.    assert
8100: 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20  ( z[0]=='?' );. 
8110: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b     x = (ynVar)(+
8120: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
8130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
8140: 20 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20   doAdd = 0;.    
8150: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
8160: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
8170: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
8180: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
8190: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
81a0: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
81b0: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
81c0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
81d0: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
81e0: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20       int bOk;.  
81f0: 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20      if( n==2 ){ 
8200: 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49  /*OPTIMIZATION-I
8210: 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20  F-TRUE*/.       
8220: 20 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20   i = z[1]-'0';  
8230: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
8240: 73 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73  se of ?N for a s
8250: 69 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f  ingle digit N */
8260: 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31  .        bOk = 1
8270: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8280: 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d         bOk = 0==
8290: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a  sqlite3Atoi64(&z
82a0: 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51  [1], &i, n-1, SQ
82b0: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
82c0: 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
82d0: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
82e0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
82f0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8300: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
8310: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
8320: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
8330: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
8340: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
8350: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8360: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
8370: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
8380: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
8390: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
83a0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
83b0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
83c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
83d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
83e0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
83f0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
8400: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
8410: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
8420: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
8430: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
8440: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
8450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8460: 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20  x = (ynVar)i;.  
8470: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
8480: 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ->nVar ){.      
8490: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
84a0: 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20   (int)x;.       
84b0: 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20   doAdd = 1;.    
84c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
84d0: 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d  te3VListNumToNam
84e0: 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  e(pParse->pVList
84f0: 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , x)==0 ){.     
8500: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8510: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
8520: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
8530: 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c  rds like ":aaa",
8540: 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61   "$aaa" or "@aaa
8550: 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61  ".  Reuse the sa
8560: 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  me variable.    
8570: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
8580: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
8590: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
85a0: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
85b0: 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  name.      ** ha
85c0: 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64  s never appeared
85d0: 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74   before, reuse t
85e0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
85f0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f   number.      */
8600: 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61  .      x = (ynVa
8610: 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61  r)sqlite3VListNa
8620: 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e  meToNum(pParse->
8630: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20  pVList, z, n);. 
8640: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b       if( x==0 ){
8650: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e  .        x = (yn
8660: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
8670: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f  Var);.        do
8680: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
8690: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
86a0: 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50  oAdd ){.      pP
86b0: 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73  arse->pVList = s
86c0: 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28 64  qlite3VListAdd(d
86d0: 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  b, pParse->pVLis
86e0: 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20  t, z, n, x);.   
86f0: 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e   }.  }.  pExpr->
8700: 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69  iColumn = x;.  i
8710: 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  f( x>db->aLimit[
8720: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
8730: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
8740: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8750: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
8760: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
8770: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
8780: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
8790: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
87a0: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73  ssion tree..*/.s
87b0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
87c0: 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74  NLINE void sqlit
87d0: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73  e3ExprDeleteNN(s
87e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
87f0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
8800: 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e  p!=0 );.  /* San
8810: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
8820: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
8830: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
8840: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
8850: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
8860: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8870: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
8880: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
8890: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
88a0: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 45 78  E_DEBUG.  if( Ex
88b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
88c0: 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21 45 78   EP_Leaf) && !Ex
88d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
88e0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
88f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8900: 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20  >pLeft==0 );.   
8910: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
8920: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht==0 );.    ass
8930: 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63  ert( p->x.pSelec
8940: 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  t==0 );.  }.#end
8950: 69 66 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  if.  if( !ExprHa
8960: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45 50  sProperty(p, (EP
8970: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65  _TokenOnly|EP_Le
8980: 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  af)) ){.    /* T
8990: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
89a0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
89b0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
89c0: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
89d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
89e0: 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d  x.pList==0 || p-
89f0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8a00: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26    if( p->pLeft &
8a10: 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  & p->op!=TK_SELE
8a20: 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69  CT_COLUMN ) sqli
8a30: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8a40: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
8a50: 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
8a60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8a70: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62  3ExprDeleteNN(db
8a80: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
8a90: 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
8aa0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8ab0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
8ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
8ad0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
8ae0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
8af0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8b00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8b10: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  ete(db, p->x.pLi
8b20: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
8b30: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8b40: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
8b50: 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  d) ){.      sqli
8b60: 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28  te3WindowDelete(
8b70: 64 62 2c 20 70 2d 3e 70 57 69 6e 29 3b 0a 20 20  db, p->pWin);.  
8b80: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 45 78    }.  }.  if( Ex
8b90: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8ba0: 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20   EP_MemToken) ) 
8bb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8bc0: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
8bd0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
8be0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61  operty(p, EP_Sta
8bf0: 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  tic) ){.    sqli
8c00: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
8c10: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
8c20: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8c30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
8c40: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
8c50: 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  ) sqlite3ExprDel
8c60: 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a  eteNN(db, p);.}.
8c70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8c80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
8c90: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
8ca0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
8cb0: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73  tructure .** pas
8cc0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
8cd0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20   argument. This 
8ce0: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
8cf0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a   EXPR_FULLSIZE,.
8d00: 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44 53  ** EXPR_REDUCEDS
8d10: 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45  IZE or EXPR_TOKE
8d20: 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74  NONLYSIZE..*/.st
8d30: 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74 72  atic int exprStr
8d40: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29  uctSize(Expr *p)
8d50: 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  {.  if( ExprHasP
8d60: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
8d70: 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  kenOnly) ) retur
8d80: 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  n EXPR_TOKENONLY
8d90: 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72  SIZE;.  if( Expr
8da0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8db0: 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65 74  P_Reduced) ) ret
8dc0: 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44  urn EXPR_REDUCED
8dd0: 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45  SIZE;.  return E
8de0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a  XPR_FULLSIZE;.}.
8df0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64  ./*.** The duped
8e00: 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74  Expr*Size() rout
8e10: 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72 6e  ines each return
8e20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
8e30: 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  ytes required.**
8e40: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79   to store a copy
8e50: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
8e60: 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  n or expression 
8e70: 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66 66  tree.  They diff
8e80: 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63  er in.** how muc
8e90: 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69 73  h of the tree is
8ea0: 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a   measured..**.**
8eb0: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 74       dupedExprSt
8ec0: 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20 53  ructSize()     S
8ed0: 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20  ize of only the 
8ee0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 0a  Expr structure .
8ef0: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
8f00: 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20 20  NodeSize()      
8f10: 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20   Size of Expr + 
8f20: 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a  space for token.
8f30: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
8f40: 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20 20  Size()          
8f50: 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20   Expr + token + 
8f60: 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e  subtree componen
8f70: 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ts.**.**********
8f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fc0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  *.**.** The dupe
8fd0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
8fe0: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
8ff0: 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52  ns two values OR
9000: 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a  -ed together:  .
9010: 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63 65  ** (1) the space
9020: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20   required for a 
9030: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
9040: 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20   structure only 
9050: 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20  and .** (2) the 
9060: 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61  EP_xxx flags tha
9070: 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20  t indicate what 
9080: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73 69  the structure si
9090: 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a  ze should be..**
90a0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
90b0: 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  es is always one
90c0: 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   of:.**.**      
90d0: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a  EXPR_FULLSIZE.**
90e0: 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55 43        EXPR_REDUC
90f0: 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65  EDSIZE   | EP_Re
9100: 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58  duced.**      EX
9110: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
9120: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a   | EP_TokenOnly.
9130: 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  **.** The size o
9140: 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
9150: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
9160: 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75  masking the retu
9170: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  rn value.** of t
9180: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
9190: 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61   0xfff.  The fla
91a0: 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  gs can be found 
91b0: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a  by masking the.*
91c0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  * return value w
91d0: 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ith EP_Reduced|E
91e0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a  P_TokenOnly..**.
91f0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74  ** Note that wit
9200: 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  h flags==EXPRDUP
9210: 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f  _REDUCE, this ro
9220: 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20  utines works on 
9230: 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e  full-size.** (un
9240: 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f 62  reduced) Expr ob
9250: 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f 72  jects as they or
9260: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73   originally cons
9270: 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20 70  tructed by the p
9280: 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67  arser..** During
9290: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
92a0: 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f  ysis, extra info
92b0: 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75  rmation is compu
92c0: 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e  ted and moved in
92d0: 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74  to.** later part
92e0: 73 20 6f 66 20 74 68 65 20 45 78 70 72 20 6f 62  s of the Expr ob
92f0: 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65 78  ject and that ex
9300: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
9310: 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70 65  might get choppe
9320: 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20  d.** off if the 
9330: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
9340: 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73  duced.  Note als
9350: 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  o that it does n
9360: 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61  ot work to.** ma
9370: 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52 45  ke an EXPRDUP_RE
9380: 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72  DUCE copy of a r
9390: 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69 6f  educed expressio
93a0: 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c  n.  It is only l
93b0: 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63  egal.** to reduc
93c0: 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78 70  e a pristine exp
93d0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f  ression tree fro
93e0: 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 54  m the parser.  T
93f0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
9400: 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70  n.** of dupedExp
9410: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f  rStructSize() co
9420: 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61  ntain multiple a
9430: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
9440: 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  ts that attempt.
9450: 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ** to enforce th
9460: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a  is constraint..*
9470: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
9480: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
9490: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
94a0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  ags){.  int nSiz
94b0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  e;.  assert( fla
94c0: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
94d0: 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29  CE || flags==0 )
94e0: 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c  ; /* Only one fl
94f0: 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64  ag value allowed
9500: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 58   */.  assert( EX
9510: 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66  PR_FULLSIZE<=0xf
9520: 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ff );.  assert( 
9530: 28 30 78 66 66 66 20 26 20 28 45 50 5f 52 65 64  (0xfff & (EP_Red
9540: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9550: 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  y))==0 );.  if( 
9560: 30 3d 3d 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f  0==flags || p->o
9570: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
9580: 55 4d 4e 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  UMN .#ifndef SQL
9590: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
95a0: 55 4e 43 0a 20 20 20 7c 7c 20 70 2d 3e 70 57 69  UNC.   || p->pWi
95b0: 6e 20 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  n .#endif.  ){. 
95c0: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
95d0: 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73  FULLSIZE;.  }els
95e0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  e{.    assert( !
95f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9600: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
9610: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
9620: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9630: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9640: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a  P_FromJoin) ); .
9650: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9660: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9670: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a  EP_MemToken) );.
9680: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9690: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
96a0: 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a  EP_NoReduce) );.
96b0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
96c0: 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   || p->x.pList )
96d0: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
96e0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
96f0: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20   | EP_Reduced;. 
9700: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9710: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
9720: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53  t==0 );.      nS
9730: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
9740: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
9750: 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20  kenOnly;.    }. 
9760: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a   }.  return nSiz
9770: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
9780: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
9790: 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62  s the space in b
97a0: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
97b0: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
97c0: 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20  .** of the Expr 
97d0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
97e0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
97f0: 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  .u.zToken string
9800: 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72   (if that.** str
9810: 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29  ing is defined.)
9820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9830: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
9840: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
9850: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
9860: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
9870: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
9880: 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28  ) & 0xfff;.  if(
9890: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
98a0: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
98b0: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
98c0: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
98d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
98e0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b  (p->u.zToken)+1;
98f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f  .  }.  return RO
9900: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a  UND8(nByte);.}..
9910: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
9920: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9930: 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65   required to cre
9940: 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ate a duplicate 
9950: 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  of the .** expre
9960: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
9970: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
9980: 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  nt. The second a
9990: 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
99a0: 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mask containing 
99b0: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
99c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  s..**.** The val
99d0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  ue returned incl
99e0: 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72  udes space to cr
99f0: 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
9a00: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a  he Expr struct.*
9a10: 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65  * itself and the
9a20: 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64   buffer referred
9a30: 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54   to by Expr.u.zT
9a40: 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a  oken, if any..**
9a50: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
9a60: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
9a70: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
9a80: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63  return value inc
9a90: 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20  ludes .** space 
9aa0: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c  to duplicate all
9ab0: 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74   Expr nodes in t
9ac0: 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62  he tree formed b
9ad0: 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a  y Expr.pLeft .**
9ae0: 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74   and Expr.pRight
9af0: 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20   variables (but 
9b00: 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75  not for any stru
9b10: 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74  ctures pointed t
9b20: 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64  o or .** descend
9b30: 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  ed from the Expr
9b40: 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72  .x.pList or Expr
9b50: 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61  .x.pSelect varia
9b60: 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  bles)..*/.static
9b70: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69   int dupedExprSi
9b80: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
9b90: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
9ba0: 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  yte = 0;.  if( p
9bb0: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
9bc0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
9bd0: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
9be0: 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44   if( flags&EXPRD
9bf0: 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20  UP_REDUCE ){.   
9c00: 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65     nByte += dupe
9c10: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65  dExprSize(p->pLe
9c20: 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70  ft, flags) + dup
9c30: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52  edExprSize(p->pR
9c40: 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ight, flags);.  
9c50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9c60: 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nByte;.}../*.**
9c70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
9c80: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
9c90: 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65  ite3ExprDup(), e
9ca0: 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a  xcept that if pz
9cb0: 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f  Buffer .** is no
9cc0: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42  t NULL then *pzB
9cd0: 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64  uffer is assumed
9ce0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
9cf0: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
9d00: 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  gh .** to store 
9d10: 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72  the copy of expr
9d20: 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f  ession p, the co
9d30: 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f  pies of p->u.zTo
9d40: 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69  ken.** (if appli
9d50: 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20  cable), and the 
9d60: 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d  copies of the p-
9d70: 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52  >pLeft and p->pR
9d80: 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ight expressions
9d90: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66  ,.** if any. Bef
9da0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
9db0: 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20  pzBuffer is set 
9dc0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
9dd0: 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f  e past the.** po
9de0: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66  rtion of the buf
9df0: 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  fer copied into 
9e00: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
9e10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
9e20: 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65   *exprDup(sqlite
9e30: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
9e40: 69 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38  int dupFlags, u8
9e50: 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20   **pzBuffer){.  
9e60: 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20  Expr *pNew;     
9e70: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
9e80: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38  o return */.  u8
9e90: 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20   *zAlloc;       
9ea0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70      /* Memory sp
9eb0: 61 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ace from which t
9ec0: 6f 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a  o build Expr obj
9ed0: 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61  ect */.  u32 sta
9ee0: 74 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  ticFlag;       /
9ef0: 2a 20 45 50 5f 53 74 61 74 69 63 20 69 66 20 73  * EP_Static if s
9f00: 70 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65  pace not obtaine
9f10: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f  d from malloc */
9f20: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
9f30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9f40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75   );.  assert( du
9f50: 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70  pFlags==0 || dup
9f60: 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  Flags==EXPRDUP_R
9f70: 45 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72  EDUCE );.  asser
9f80: 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c  t( pzBuffer==0 |
9f90: 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52  | dupFlags==EXPR
9fa0: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20  DUP_REDUCE );.. 
9fb0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
9fc0: 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
9fd0: 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63  e new Expr struc
9fe0: 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ture. */.  if( p
9ff0: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a  zBuffer ){.    z
a000: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
a010: 72 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61  r;.    staticFla
a020: 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20  g = EP_Static;. 
a030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c   }else{.    zAll
a040: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
a050: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75  llocRawNN(db, du
a060: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64  pedExprSize(p, d
a070: 75 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73  upFlags));.    s
a080: 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20  taticFlag = 0;. 
a090: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70   }.  pNew = (Exp
a0a0: 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69  r *)zAlloc;..  i
a0b0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f  f( pNew ){.    /
a0c0: 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74  * Set nNewSize t
a0d0: 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63  o the size alloc
a0e0: 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72  ated for the str
a0f0: 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
a100: 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77  o.    ** by pNew
a110: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
a120: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
a130: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
a140: 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f   or.    ** EXPR_
a150: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e  TOKENONLYSIZE. n
a160: 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20  Token is set to 
a170: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
a180: 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20  tes consumed.   
a190: 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20   ** by the copy 
a1a0: 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  of the p->u.zTok
a1b0: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e  en string (if an
a1c0: 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  y)..    */.    c
a1d0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53  onst unsigned nS
a1e0: 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65  tructSize = dupe
a1f0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
a200: 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  p, dupFlags);.  
a210: 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77    const int nNew
a220: 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69  Size = nStructSi
a230: 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20  ze & 0xfff;.    
a240: 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  int nToken;.    
a250: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
a260: 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61  erty(p, EP_IntVa
a270: 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f  lue) && p->u.zTo
a280: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f  ken ){.      nTo
a290: 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ken = sqlite3Str
a2a0: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
a2b0: 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73  n) + 1;.    }els
a2c0: 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  e{.      nToken 
a2d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
a2e0: 66 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20  f( dupFlags ){. 
a2f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
a300: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a310: 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29  EP_Reduced)==0 )
a320: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
a330: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69  Alloc, p, nNewSi
a340: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
a350: 20 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20        u32 nSize 
a360: 3d 20 28 75 33 32 29 65 78 70 72 53 74 72 75 63  = (u32)exprStruc
a370: 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20  tSize(p);.      
a380: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
a390: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , nSize);.      
a3a0: 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46  if( nSize<EXPR_F
a3b0: 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20  ULLSIZE ){ .    
a3c0: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c      memset(&zAll
a3d0: 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58  oc[nSize], 0, EX
a3e0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a  PR_FULLSIZE-nSiz
a3f0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
a400: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
a410: 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50  e EP_Reduced, EP
a420: 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20  _TokenOnly, and 
a430: 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20  EP_Static flags 
a440: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a  appropriately. *
a450: 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  /.    pNew->flag
a460: 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65  s &= ~(EP_Reduce
a470: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  d|EP_TokenOnly|E
a480: 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54  P_Static|EP_MemT
a490: 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d  oken);.    pNew-
a4a0: 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63  >flags |= nStruc
a4b0: 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75  tSize & (EP_Redu
a4c0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
a4d0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  );.    pNew->fla
a4e0: 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67  gs |= staticFlag
a4f0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  ;..    /* Copy t
a500: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
a510: 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a  tring, if any. *
a520: 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e  /.    if( nToken
a530: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
a540: 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75  zToken = pNew->u
a550: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
a560: 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a  )&zAlloc[nNewSiz
a570: 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  e];.      memcpy
a580: 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54  (zToken, p->u.zT
a590: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
a5a0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d     }..    if( 0=
a5b0: 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77  =((p->flags|pNew
a5c0: 2d 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54  ->flags) & (EP_T
a5d0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66  okenOnly|EP_Leaf
a5e0: 29 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  )) ){.      /* F
a5f0: 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d  ill in the pNew-
a600: 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e  >x.pSelect or pN
a610: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62  ew->x.pList memb
a620: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  er. */.      if(
a630: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a640: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
a650: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
a660: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73  w->x.pSelect = s
a670: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
a680: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
a690: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a6a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a6b0: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
a6c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
a6d0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c  tDup(db, p->x.pL
a6e0: 69 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  ist, dupFlags);.
a6f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
a700: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e     /* Fill in pN
a710: 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e  ew->pLeft and pN
a720: 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20  ew->pRight. */. 
a730: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
a740: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
a750: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a760: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a  Only) ){.      z
a770: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
a780: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75  prNodeSize(p, du
a790: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  pFlags);.      i
a7a0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a7b0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b  rty(pNew, EP_Tok
a7c0: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20  enOnly|EP_Leaf) 
a7d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
a7e0: 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66  >pLeft = p->pLef
a7f0: 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ?.            
a800: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75            exprDu
a810: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
a820: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
a830: 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20  &zAlloc) : 0;.  
a840: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
a850: 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f  ht = p->pRight ?
a860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a870: 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28          exprDup(
a880: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45  db, p->pRight, E
a890: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a8a0: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a8b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a8c0: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  zBuffer ){.     
a8d0: 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a     *pzBuffer = z
a8e0: 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20  Alloc;.      }. 
a8f0: 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65     }else{.#ifnde
a900: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
a910: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69  NDOWFUNC.      i
a920: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a930: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
a940: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29  |EP_TokenOnly) )
a950: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a960: 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  pWin = 0;.      
a970: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
a980: 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 73 71 6c 69  New->pWin = sqli
a990: 74 65 33 57 69 6e 64 6f 77 44 75 70 28 64 62 2c  te3WindowDup(db,
a9a0: 20 70 4e 65 77 2c 20 70 2d 3e 70 57 69 6e 29 3b   pNew, p->pWin);
a9b0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  .      }.#endif 
a9c0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
a9d0: 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20  INDOWFUNC */.   
a9e0: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
a9f0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
aa00: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
aa10: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
aa20: 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  pNew->op==TK_SEL
aa30: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  ECT_COLUMN ){.  
aa40: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
aa50: 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a  eft = p->pLeft;.
aa60: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
aa70: 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  ( p->iColumn==0 
aa80: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
aa90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
aaa0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
aab0: 30 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d  0  || p->pRight=
aac0: 3d 70 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20  =p->pLeft );.   
aad0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aae0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
aaf0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
ab00: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c  up(db, p->pLeft,
ab10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
ab20: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
ab30: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
ab40: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
ab50: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ht, 0);.      }.
ab60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
ab70: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
ab80: 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74  * Create and ret
ab90: 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20  urn a deep copy 
aba0: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61  of the object pa
abb0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
abc0: 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  nd .** argument.
abd0: 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69   If an OOM condi
abe0: 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65  tion is encounte
abf0: 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  red, NULL is ret
ac00: 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  urned.** and the
ac10: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ac20: 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23  d flag set..*/.#
ac30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ac40: 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69  IT_CTE.static Wi
ac50: 74 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69  th *withDup(sqli
ac60: 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
ac70: 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20  ){.  With *pRet 
ac80: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
ac90: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
aca0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a  sizeof(*p) + siz
acb0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
acc0: 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20  p->nCte-1);.    
acd0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  pRet = sqlite3Db
ace0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
acf0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
ad00: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Ret ){.      int
ad10: 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   i;.      pRet->
ad20: 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a  nCte = p->nCte;.
ad30: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ad40: 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
ad50: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
ad60: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
ad70: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
ad80: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  , p->a[i].pSelec
ad90: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
ada0: 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20  Ret->a[i].pCols 
adb0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
adc0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
add0: 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20  .pCols, 0);.    
ade0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a      pRet->a[i].z
adf0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
ae00: 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  StrDup(db, p->a[
ae10: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
ae20: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
ae30: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
ae40: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74  lse.# define wit
ae50: 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64  hDup(x,y) 0.#end
ae60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
ae70: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
ae80: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
ae90: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
aea0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
aeb0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
aec0: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
aed0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
aee0: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
aef0: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
af00: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
af10: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
af20: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
af30: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
af40: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
af50: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
af60: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
af70: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
af80: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
af90: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
afa0: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
afb0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
afc0: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
afd0: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
afe0: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
aff0: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
b000: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
b010: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
b020: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
b030: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
b040: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
b050: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
b060: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
b070: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
b080: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
b090: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
b0a0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
b0b0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
b0c0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  ..** If the EXPR
b0d0: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
b0e0: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
b0f0: 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
b100: 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e  ned is a.** trun
b110: 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  cated version of
b120: 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20   the usual Expr 
b130: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
b140: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
b150: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
b160: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
b170: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b180: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
b190: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
b1a0: 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  3ExprDup(sqlite3
b1b0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
b1c0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
b1d0: 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
b1e0: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
b1f0: 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75  REDUCE );.  retu
b200: 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70 28 64  rn p ? exprDup(d
b210: 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 20  b, p, flags, 0) 
b220: 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20  : 0;.}.ExprList 
b230: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
b240: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b250: 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e   ExprList *p, in
b260: 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72  t flags){.  Expr
b270: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
b280: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
b290: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
b2a0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
b2b0: 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53 65 6c   Expr *pPriorSel
b2c0: 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73  ectCol = 0;.  as
b2d0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
b2e0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b2f0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
b300: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b310: 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65 33 44  wNN(db, sqlite3D
b320: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
b330: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  p));.  if( pNew=
b340: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b350: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70   pNew->nExpr = p
b360: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74 65 6d  ->nExpr;.  pItem
b370: 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f   = pNew->a;.  pO
b380: 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20  ldItem = p->a;. 
b390: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b3a0: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
b3b0: 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b  ++, pOldItem++){
b3c0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45  .    Expr *pOldE
b3d0: 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  xpr = pOldItem->
b3e0: 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
b3f0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 70  *pNewExpr;.    p
b400: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Item->pExpr = sq
b410: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b420: 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73   pOldExpr, flags
b430: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45  );.    if( pOldE
b440: 78 70 72 20 0a 20 20 20 20 20 26 26 20 70 4f 6c  xpr .     && pOl
b450: 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  dExpr->op==TK_SE
b460: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  LECT_COLUMN.    
b470: 20 26 26 20 28 70 4e 65 77 45 78 70 72 20 3d 20   && (pNewExpr = 
b480: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30  pItem->pExpr)!=0
b490: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61   .    ){.      a
b4a0: 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d  ssert( pNewExpr-
b4b0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69  >iColumn==0 || i
b4c0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
b4d0: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
b4e0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
b4f0: 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78 70 72  assert( pOldExpr
b500: 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70  ->pLeft==pOldExp
b510: 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20  r->pRight );.   
b520: 20 20 20 20 20 70 50 72 69 6f 72 53 65 6c 65 63       pPriorSelec
b530: 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d  tCol = pNewExpr-
b540: 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70  >pLeft = pNewExp
b550: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
b560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b570: 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
b580: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b590: 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d  Item[-1].pExpr!=
b5a0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
b5b0: 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69  ert( pNewExpr->i
b5c0: 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31  Column==pItem[-1
b5d0: 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
b5e0: 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  +1 );.        as
b5f0: 73 65 72 74 28 20 70 50 72 69 6f 72 53 65 6c 65  sert( pPriorSele
b600: 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d  ctCol==pItem[-1]
b610: 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b  .pExpr->pLeft );
b620: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 45 78 70  .        pNewExp
b630: 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50 72 69 6f  r->pLeft = pPrio
b640: 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20  rSelectCol;.    
b650: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49    }.    }.    pI
b660: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
b670: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b680: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
b690: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
b6a0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
b6b0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b6c0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
b6d0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
b6e0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
b6f0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
b700: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
b710: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
b720: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
b730: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
b740: 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
b750: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 6f   = pOldItem->bSo
b760: 72 74 65 72 52 65 66 3b 0a 20 20 20 20 70 49 74  rterRef;.    pIt
b770: 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d  em->u = pOldItem
b780: 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ->u;.  }.  retur
b790: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
b7a0: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
b7b0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
b7c0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
b7d0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
b7e0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
b7f0: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
b800: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
b810: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
b820: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
b830: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
b840: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
b850: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
b860: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
b870: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
b880: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
b890: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b8a0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
b8b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b8c0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
b8d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b8e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
b8f0: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
b900: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
b910: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
b920: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
b930: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
b940: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
b950: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64  yte;.  assert( d
b960: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b970: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b980: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
b990: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
b9a0: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
b9b0: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
b9c0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
b9d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b9e0: 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29  awNN(db, nByte )
b9f0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
ba00: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
ba10: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
ba20: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
ba30: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
ba40: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
ba50: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
ba60: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
ba70: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
ba80: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
ba90: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
baa0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
bab0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
bac0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63     pNewItem->pSc
bad0: 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  hema = pOldItem-
bae0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e  >pSchema;.    pN
baf0: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
bb00: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
bb10: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bb20: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
bb30: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
bb40: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
bb50: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bb60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
bb70: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
bb80: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
bb90: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
bba0: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
bbb0: 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49  Item->fg = pOldI
bbc0: 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65  tem->fg;.    pNe
bbd0: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
bbe0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
bbf0: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
bc00: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
bc10: 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69  pOldItem->addrFi
bc20: 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49  llSub;.    pNewI
bc30: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
bc40: 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65   pOldItem->regRe
bc50: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e  turn;.    if( pN
bc60: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64  ewItem->fg.isInd
bc70: 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20  exedBy ){.      
bc80: 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  pNewItem->u1.zIn
bc90: 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
bca0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
bcb0: 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ldItem->u1.zInde
bcc0: 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  xedBy);.    }.  
bcd0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49    pNewItem->pIBI
bce0: 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ndex = pOldItem-
bcf0: 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69  >pIBIndex;.    i
bd00: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
bd10: 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
bd20: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e     pNewItem->u1.
bd30: 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20  pFuncArg = .    
bd40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
bd50: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  rListDup(db, pOl
bd60: 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  dItem->u1.pFuncA
bd70: 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  rg, flags);.    
bd80: 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  }.    pTab = pNe
bd90: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
bda0: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
bdb0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
bdc0: 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
bdd0: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f++;.    }.    p
bde0: 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  NewItem->pSelect
bdf0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
be00: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
be10: 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73  ->pSelect, flags
be20: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
be30: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
be40: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  prDup(db, pOldIt
be50: 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b  em->pOn, flags);
be60: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
be70: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
be80: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  dListDup(db, pOl
be90: 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  dItem->pUsing);.
bea0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f      pNewItem->co
beb0: 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lUsed = pOldItem
bec0: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20  ->colUsed;.  }. 
bed0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
bee0: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
bef0: 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  dListDup(sqlite3
bf00: 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29   *db, IdList *p)
bf10: 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77  {.  IdList *pNew
bf20: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
bf30: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
bf40: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
bf50: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
bf60: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
bf70: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
bf80: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
bf90: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
bfa0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
bfb0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
bfc0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
bfd0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e  locRawNN(db, p->
bfe0: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
bff0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
c000: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
c010: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
c020: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
c030: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
c040: 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61 75   Note that becau
c050: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
c060: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  he allocation fo
c070: 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a  r p->a[] is not.
c080: 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79    ** necessarily
c090: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c   a power of two,
c0a0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
c0b0: 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62  pend() may not b
c0c0: 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e  e called.  ** on
c0d0: 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
c0e0: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20 66  reated by this f
c0f0: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f  unction. */.  fo
c100: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
c110: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
c120: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
c130: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
c140: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
c150: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
c160: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
c170: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
c180: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
c190: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
c1a0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
c1b0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
c1c0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
c1d0: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
c1e0: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
c1f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
c200: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
c210: 6c 65 63 74 20 2a 70 44 75 70 2c 20 69 6e 74 20  lect *pDup, int 
c220: 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74  flags){.  Select
c230: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 53 65   *pRet = 0;.  Se
c240: 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b  lect *pNext = 0;
c250: 0a 20 20 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d  .  Select **pp =
c260: 20 26 70 52 65 74 3b 0a 20 20 53 65 6c 65 63 74   &pRet;.  Select
c270: 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
c280: 64 62 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70  db!=0 );.  for(p
c290: 3d 70 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70  =pDup; p; p=p->p
c2a0: 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
c2b0: 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  ct *pNew = sqlit
c2c0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
c2d0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
c2e0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
c2f0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
c300: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
c310: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c320: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
c330: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c340: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
c350: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
c360: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
c370: 20 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65      pNew->pWhere
c380: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
c390: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
c3a0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c3b0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
c3c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c3d0: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
c3e0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c3f0: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
c400: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c410: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
c420: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c430: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
c440: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c450: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
c460: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c470: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
c480: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  pNew->pNext = pN
c490: 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ext;.    pNew->p
c4a0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
c4b0: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
c4c0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c4d0: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67   p->pLimit, flag
c4e0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c  s);.    pNew->iL
c4f0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
c500: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
c510: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c  .    pNew->selFl
c520: 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
c530: 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65  s & ~SF_UsesEphe
c540: 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77 2d  meral;.    pNew-
c550: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
c560: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
c570: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
c580: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
c590: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
c5a0: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
c5b0: 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77   pNew->pWith = w
c5c0: 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  ithDup(db, p->pW
c5d0: 69 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ith);.#ifndef SQ
c5e0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
c5f0: 46 55 4e 43 0a 20 20 20 20 70 4e 65 77 2d 3e 70  FUNC.    pNew->p
c600: 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Win = 0;.    pNe
c610: 77 2d 3e 70 57 69 6e 44 65 66 6e 20 3d 20 73 71  w->pWinDefn = sq
c620: 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44  lite3WindowListD
c630: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 6e 44 65  up(db, p->pWinDe
c640: 66 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  fn);.#endif.    
c650: 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d 20 70 2d  pNew->selId = p-
c660: 3e 73 65 6c 49 64 3b 0a 20 20 20 20 2a 70 70 20  >selId;.    *pp 
c670: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 70 20 3d  = pNew;.    pp =
c680: 20 26 70 4e 65 77 2d 3e 70 50 72 69 6f 72 3b 0a   &pNew->pPrior;.
c690: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 4e 65 77      pNext = pNew
c6a0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
c6b0: 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65  pRet;.}.#else.Se
c6c0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
c6d0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
c6e0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
c6f0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
c700: 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72  ert( p==0 );.  r
c710: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
c720: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
c730: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
c740: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70  he end of an exp
c750: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
c760: 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e  f pList is.** in
c770: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
c780: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
c790: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
c7a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74  .**.** The pList
c7b0: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
c7c0: 65 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72  e either NULL or
c7d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
c7e0: 20 45 78 70 72 4c 69 73 74 0a 2a 2a 20 6f 62 74   ExprList.** obt
c7f0: 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 70 72 69  ained from a pri
c800: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
c810: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
c820: 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ().  This routin
c830: 65 0a 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20  e.** may not be 
c840: 75 73 65 64 20 77 69 74 68 20 61 6e 20 45 78 70  used with an Exp
c850: 72 4c 69 73 74 20 6f 62 74 61 69 6e 65 64 20 66  rList obtained f
c860: 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  rom sqlite3ExprL
c870: 69 73 74 44 75 70 28 29 2e 0a 2a 2a 20 52 65 61  istDup()..** Rea
c880: 73 6f 6e 3a 20 20 54 68 69 73 20 72 6f 75 74 69  son:  This routi
c890: 6e 65 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ne assumes that 
c8a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c  the number of sl
c8b0: 6f 74 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b  ots in pList->a[
c8c0: 5d 0a 2a 2a 20 69 73 20 61 20 70 6f 77 65 72 20  ].** is a power 
c8d0: 6f 66 20 74 77 6f 2e 20 20 54 68 61 74 20 69 73  of two.  That is
c8e0: 20 74 72 75 65 20 66 6f 72 20 73 71 6c 69 74 65   true for sqlite
c8f0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
c900: 29 20 72 65 74 75 72 6e 73 0a 2a 2a 20 62 75 74  ) returns.** but
c910: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
c920: 69 6c 79 20 74 72 75 65 20 66 72 6f 6d 20 74 68  ily true from th
c930: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
c940: 66 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  f sqlite3ExprLis
c950: 74 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  tDup()..**.** If
c960: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
c970: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
c980: 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69  s, the entire li
c990: 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a  st is freed and.
c9a0: 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
c9b0: 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c  ned.  If non-NUL
c9c0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  L is returned, t
c9d0: 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
c9e0: 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65  teed.** that the
c9f0: 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73   new entry was s
ca00: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65  uccessfully appe
ca10: 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  nded..*/.ExprLis
ca20: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
ca30: 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73  stAppend(.  Pars
ca40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ca50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
ca60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
ca70: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
ca80: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
ca90: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
caa0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
cab0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
cac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
cad0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
cae0: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
caf0: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
cb00: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
cb10: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
cb20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
cb30: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
cb40: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
cb50: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
cb60: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
cb70: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
cb80: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  , sizeof(ExprLis
cb90: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
cba0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
cbb0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
cbc0: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45   }.    pList->nE
cbd0: 78 70 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  xpr = 0;.  }else
cbe0: 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78   if( (pList->nEx
cbf0: 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78  pr & (pList->nEx
cc00: 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  pr-1))==0 ){.   
cc10: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b   ExprList *pNew;
cc20: 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
cc30: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
cc40: 20 70 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20   pList, .       
cc50: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c        sizeof(*pL
cc60: 69 73 74 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e  ist)+(2*pList->n
cc70: 45 78 70 72 20 2d 20 31 29 2a 73 69 7a 65 6f 66  Expr - 1)*sizeof
cc80: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
cc90: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
cca0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
ccb0: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
ccc0: 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pList = pNew;.  
ccd0: 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
cce0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
ccf0: 70 72 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28  pr++];.  assert(
cd00: 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74   offsetof(struct
cd10: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a   ExprList_item,z
cd20: 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49  Name)==sizeof(pI
cd30: 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20  tem->pExpr) );. 
cd40: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f   assert( offseto
cd50: 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73  f(struct ExprLis
cd60: 74 5f 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30  t_item,pExpr)==0
cd70: 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 49   );.  memset(&pI
cd80: 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a  tem->zName,0,siz
cd90: 65 6f 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73  eof(*pItem)-offs
cda0: 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72  etof(struct Expr
cdb0: 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29  List_item,zName)
cdc0: 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  );.  pItem->pExp
cdd0: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74  r = pExpr;.  ret
cde0: 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d  urn pList;..no_m
cdf0: 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76  em:     .  /* Av
ce00: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
ce10: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73  ry if malloc has
ce20: 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71   failed. */.  sq
ce30: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
ce40: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  db, pExpr);.  sq
ce50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
ce60: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
ce70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
ce80: 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e  *.** pColumns an
ce90: 64 20 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76  d pExpr form a v
cea0: 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74  ector assignment
ceb0: 20 77 68 69 63 68 20 69 73 20 70 61 72 74 20 6f   which is part o
cec0: 66 20 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61  f the SET.** cla
ced0: 75 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45  use of an UPDATE
cee0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b   statement.  Lik
cef0: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
cf00: 20 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28       (a,b,c) = (
cf10: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
cf20: 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c  3).** Or:    (a,
cf30: 62 2c 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78  b,c) = (SELECT x
cf40: 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a  ,y,z FROM ....).
cf50: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74  **.** For each t
cf60: 65 72 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f  erm of the vecto
cf70: 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70  r assignment, ap
cf80: 70 65 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73  pend new entries
cf90: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   to the.** expre
cfa0: 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74  ssion list pList
cfb0: 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f  .  In the case o
cfc0: 66 20 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20  f a subquery on 
cfd0: 74 68 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a  the RHS, append.
cfe0: 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  ** TK_SELECT_COL
cff0: 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  UMN expressions.
d000: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
d010: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
d020: 65 6e 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72  endVector(.  Par
d030: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d040: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
d050: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
d060: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
d070: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
d080: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
d090: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
d0a0: 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d    IdList *pColum
d0b0: 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ns,      /* List
d0c0: 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53   of names of LHS
d0d0: 20 6f 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65   of the assignme
d0e0: 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  nt */.  Expr *pE
d0f0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
d100: 2a 20 56 65 63 74 6f 72 20 65 78 70 72 65 73 73  * Vector express
d110: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
d120: 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  ed. Might be NUL
d130: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  L */.){.  sqlite
d140: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d150: 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  db;.  int n;.  i
d160: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72  nt i;.  int iFir
d170: 73 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  st = pList ? pLi
d180: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
d190: 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e   /* pColumns can
d1a0: 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75   only be NULL du
d1b0: 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20  e to an OOM but 
d1c0: 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73  an OOM will caus
d1d0: 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70  e an.  ** exit p
d1e0: 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
d1f0: 74 69 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b  tine being invok
d200: 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  ed */.  if( NEVE
d210: 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29  R(pColumns==0) )
d220: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
d230: 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  end_error;.  if(
d240: 20 70 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f   pExpr==0 ) goto
d250: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
d260: 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  rror;..  /* If t
d270: 68 65 20 52 48 53 20 69 73 20 61 20 76 65 63 74  he RHS is a vect
d280: 6f 72 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  or, then we can 
d290: 69 6d 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63  immediately chec
d2a0: 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20  k to see that . 
d2b0: 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20   ** the size of 
d2c0: 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20  the RHS and LHS 
d2d0: 6d 61 74 63 68 2e 20 20 42 75 74 20 69 66 20 74  match.  But if t
d2e0: 68 65 20 52 48 53 20 69 73 20 61 20 53 45 4c 45  he RHS is a SELE
d2f0: 43 54 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61  CT, .  ** wildca
d300: 72 64 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65  rds ("*") in the
d310: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
d320: 68 65 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62  he SELECT must b
d330: 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72  e expanded befor
d340: 65 0a 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f  e.  ** we can do
d350: 20 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c   the size check,
d360: 20 73 6f 20 64 65 66 65 72 20 74 68 65 20 73 69   so defer the si
d370: 7a 65 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63  ze check until c
d380: 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a  ode generation..
d390: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
d3a0: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op!=TK_SELECT 
d3b0: 26 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64  && pColumns->nId
d3c0: 21 3d 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72  !=(n=sqlite3Expr
d3d0: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
d3e0: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
d3f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d400: 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73  , "%d columns as
d410: 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73  signed %d values
d420: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
d430: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d         pColumns-
d440: 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f  >nId, n);.    go
d450: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
d460: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66  _error;.  }..  f
d470: 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d  or(i=0; i<pColum
d480: 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  ns->nId; i++){. 
d490: 20 20 20 45 78 70 72 20 2a 70 53 75 62 45 78 70     Expr *pSubExp
d4a0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46  r = sqlite3ExprF
d4b0: 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50  orVectorField(pP
d4c0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b  arse, pExpr, i);
d4d0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
d4e0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
d4f0: 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  nd(pParse, pList
d500: 2c 20 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20  , pSubExpr);.   
d510: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
d520: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
d530: 74 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74  t->nExpr==iFirst
d540: 2b 69 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c  +i+1 );.      pL
d550: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
d560: 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70  xpr-1].zName = p
d570: 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e  Columns->a[i].zN
d580: 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75  ame;.      pColu
d590: 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  mns->a[i].zName 
d5a0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
d5b0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
d5c0: 63 46 61 69 6c 65 64 20 26 26 20 70 45 78 70 72  cFailed && pExpr
d5d0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
d5e0: 26 26 20 41 4c 57 41 59 53 28 70 4c 69 73 74 21  && ALWAYS(pList!
d5f0: 3d 30 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20  =0) ){.    Expr 
d600: 2a 70 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d  *pFirst = pList-
d610: 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72  >a[iFirst].pExpr
d620: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
d630: 69 72 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  irst!=0 );.    a
d640: 73 73 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f  ssert( pFirst->o
d650: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
d660: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20  UMN );.     .   
d670: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45   /* Store the SE
d680: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
d690: 6e 20 70 52 69 67 68 74 20 73 6f 20 69 74 20 77  n pRight so it w
d6a0: 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77  ill be deleted w
d6b0: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  hen.    ** sqlit
d6c0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
d6d0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a  () is called */.
d6e0: 20 20 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67      pFirst->pRig
d6f0: 68 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  ht = pExpr;.    
d700: 70 45 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20  pExpr = 0;..    
d710: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
d720: 73 69 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20  size of the LHS 
d730: 69 6e 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61  in iTable so tha
d740: 74 20 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74  t we can check t
d750: 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  hat.    ** the R
d760: 48 53 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73  HS and LHS sizes
d770: 20 6d 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f   match during co
d780: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a  de generation. *
d790: 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54  /.    pFirst->iT
d7a0: 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d  able = pColumns-
d7b0: 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f  >nId;.  }..vecto
d7c0: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a  r_append_error:.
d7d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
d7e0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
d7f0: 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
d800: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d  elete(db, pColum
d810: 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  ns);.  return pL
d820: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ist;.}../*.** Se
d830: 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72  t the sort order
d840: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c   for the last el
d850: 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76  ement on the giv
d860: 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a  en ExprList..*/.
d870: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
d880: 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72  ListSetSortOrder
d890: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
d8a0: 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20  t iSortOrder){. 
d8b0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
d8c0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51  rn;.  assert( SQ
d8d0: 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45  LITE_SO_UNDEFINE
d8e0: 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  D<0 && SQLITE_SO
d8f0: 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54  _ASC>=0 && SQLIT
d900: 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20  E_SO_DESC>0 );. 
d910: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70   assert( p->nExp
d920: 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f  r>0 );.  if( iSo
d930: 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20  rtOrder<0 ){.   
d940: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d   assert( p->a[p-
d950: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
d960: 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  der==SQLITE_SO_A
d970: 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  SC );.    return
d980: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e  ;.  }.  p->a[p->
d990: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
d9a0: 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72  er = (u8)iSortOr
d9b0: 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  der;.}../*.** Se
d9c0: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
d9d0: 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74  [].zName element
d9e0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
d9f0: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
da00: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
da10: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
da20: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
da30: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
da40: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
da50: 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20  ut pName should 
da60: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
da70: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
da80: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
da90: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
daa0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
dab0: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
dac0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
dad0: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20  rListSetName(.  
dae0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
daf0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
db00: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
db10: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
db20: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
db30: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
db40: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54  the span. */.  T
db50: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
db60: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74         /* Name t
db70: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20  o be added */.  
db80: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
db90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
dba0: 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d  to cause the nam
dbb0: 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64  e to be dequoted
dbc0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
dbd0: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61   pList!=0 || pPa
dbe0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
dbf0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
dc00: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
dc10: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
dc20: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
dc30: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
dc40: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49  Expr>0 );.    pI
dc50: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
dc60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
dc70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
dc80: 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a  em->zName==0 );.
dc90: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
dca0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
dcb0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
dcc0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
dcd0: 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71  >n);.    if( deq
dce0: 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44 65  uote ) sqlite3De
dcf0: 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  quote(pItem->zNa
dd00: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  me);.  }.}../*.*
dd10: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
dd20: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65  st.a[].zSpan ele
dd30: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
dd40: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
dd50: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
dd60: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
dd70: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
dd80: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
dd90: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
dda0: 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f  .  But pSpan sho
ddb0: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
ddc0: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
ddd0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
dde0: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
ddf0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
de00: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
de10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
de20: 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e  3ExprListSetSpan
de30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
de40: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
de50: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
de60: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
de70: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
de80: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
de90: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
dea0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
deb0: 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74  Start,     /* St
dec0: 61 72 74 20 6f 66 20 74 68 65 20 73 70 61 6e 20  art of the span 
ded0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
dee0: 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20  *zEnd        /* 
def0: 45 6e 64 20 6f 66 20 74 68 65 20 73 70 61 6e 20  End of the span 
df00: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
df10: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
df20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
df30: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
df40: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
df50: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
df60: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
df70: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
df80: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
df90: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
dfa0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
dfb0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c  xpr>0 );.    sql
dfc0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
dfd0: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
dfe0: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
dff0: 20 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75   sqlite3DbSpanDu
e000: 70 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45  p(db, zStart, zE
e010: 6e 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nd);.  }.}../*.*
e020: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
e030: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
e040: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
e050: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
e060: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
e070: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
e080: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
e090: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e0a0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
e0b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
e0c0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
e0d0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e0e0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
e0f0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
e100: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
e110: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
e120: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
e130: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
e140: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
e150: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
e160: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
e170: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
e180: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
e190: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
e1a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e1b0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
e1c0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
e1d0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
e1e0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
e1f0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
e200: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion list..*/.sta
e210: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
e220: 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73  INE void exprLis
e230: 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  tDeleteNN(sqlite
e240: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
e250: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
e260: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
e270: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
e280: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
e290: 20 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73    pList->a;.  as
e2a0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
e2b0: 70 72 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  pr>0 );.  do{.  
e2c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
e2d0: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
e2e0: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
e2f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
e300: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
e310: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e320: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
e330: 0a 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20  .    pItem++;.  
e340: 7d 77 68 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b  }while( --i>0 );
e350: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
e360: 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
e370: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
e380: 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  rListDelete(sqli
e390: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
e3a0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28  t *pList){.  if(
e3b0: 20 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73   pList ) exprLis
e3c0: 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c  tDeleteNN(db, pL
e3d0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
e3e0: 65 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73  eturn the bitwis
e3f0: 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72  e-OR of all Expr
e400: 2e 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e  .flags fields in
e410: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78   the given.** Ex
e420: 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73  prList..*/.u32 s
e430: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
e440: 61 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69  ags(const ExprLi
e450: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
e460: 74 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30  t i;.  u32 m = 0
e470: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
e480: 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  t!=0 );.  for(i=
e490: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
e4a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 45 78  r; i++){.     Ex
e4b0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
e4c0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
e4d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
e4e0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 6d 20 7c  r!=0 );.     m |
e4f0: 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a  = pExpr->flags;.
e500: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a    }.  return m;.
e510: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
e520: 20 61 20 53 45 4c 45 43 54 2d 6e 6f 64 65 20 63   a SELECT-node c
e530: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
e540: 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65  expression walke
e550: 72 20 74 68 61 74 0a 2a 2a 20 61 6c 77 61 79 73  r that.** always
e560: 20 22 66 61 69 6c 73 22 2e 20 20 42 79 20 22 66   "fails".  By "f
e570: 61 69 6c 22 20 69 6e 20 74 68 69 73 20 63 61 73  ail" in this cas
e580: 65 2c 20 77 65 20 6d 65 61 6e 20 73 65 74 0a 2a  e, we mean set.*
e590: 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  * pWalker->eCode
e5a0: 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 61 62 6f   to zero and abo
e5b0: 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  rt..**.** This c
e5c0: 61 6c 6c 62 61 63 6b 20 69 73 20 75 73 65 64 20  allback is used 
e5d0: 62 79 20 6d 75 6c 74 69 70 6c 65 20 65 78 70 72  by multiple expr
e5e0: 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72 73 2e 0a  ession walkers..
e5f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
e600: 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28 57 61 6c  lectWalkFail(Wal
e610: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
e620: 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  lect *NotUsed){.
e630: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
e640: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70  ER(NotUsed);.  p
e650: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
e660: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
e670: 41 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Abort;.}../*.** 
e680: 49 66 20 74 68 65 20 69 6e 70 75 74 20 65 78 70  If the input exp
e690: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 49 44  ression is an ID
e6a0: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 22   with the name "
e6b0: 74 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22  true" or "false"
e6c0: 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  .** then convert
e6d0: 20 69 74 20 69 6e 74 6f 20 61 6e 20 54 4b 5f 54   it into an TK_T
e6e0: 52 55 45 46 41 4c 53 45 20 74 65 72 6d 2e 20 20  RUEFALSE term.  
e6f0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
e700: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 76 65 72  if.** the conver
e710: 73 69 6f 6e 20 68 61 70 70 65 6e 65 64 2c 20 61  sion happened, a
e720: 6e 64 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  nd zero if the e
e730: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 61  xpression is una
e740: 6c 74 65 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ltered..*/.int s
e750: 71 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72  qlite3ExprIdToTr
e760: 75 65 46 61 6c 73 65 28 45 78 70 72 20 2a 70 45  ueFalse(Expr *pE
e770: 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  xpr){.  assert( 
e780: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pExpr->op==TK_ID
e790: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
e7a0: 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 69 66  K_STRING );.  if
e7b0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
e7c0: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
e7d0: 2c 20 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20  , "true")==0.   
e7e0: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
e7f0: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
e800: 6e 2c 20 22 66 61 6c 73 65 22 29 3d 3d 30 0a 20  n, "false")==0. 
e810: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   ){.    pExpr->o
e820: 70 20 3d 20 54 4b 5f 54 52 55 45 46 41 4c 53 45  p = TK_TRUEFALSE
e830: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
e840: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
e850: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
e860: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20  ument must be a 
e870: 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 45 78 70  TK_TRUEFALSE Exp
e880: 72 20 6e 6f 64 65 2e 20 20 52 65 74 75 72 6e 20  r node.  Return 
e890: 31 20 69 66 20 69 74 20 69 73 20 54 52 55 45 0a  1 if it is TRUE.
e8a0: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
e8b0: 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e 74 20  s FALSE..*/.int 
e8c0: 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
e8d0: 56 61 6c 75 65 28 63 6f 6e 73 74 20 45 78 70 72  Value(const Expr
e8e0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65   *pExpr){.  asse
e8f0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
e900: 4b 5f 54 52 55 45 46 41 4c 53 45 20 29 3b 0a 20  K_TRUEFALSE );. 
e910: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e920: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
e930: 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75 65 22 29 3d  .zToken,"true")=
e940: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
e950: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
e960: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 66 61 6c  r->u.zToken,"fal
e970: 73 65 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  se")==0 );.  ret
e980: 75 72 6e 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  urn pExpr->u.zTo
e990: 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a 0a 0a 2f  ken[4]==0;.}.../
e9a0: 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
e9b0: 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63  nes are Walker c
e9c0: 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f  allbacks used to
e9d0: 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f   check expressio
e9e0: 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20  ns to.** see if 
e9f0: 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61  they are "consta
ea00: 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66  nt" for some def
ea10: 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74  inition of const
ea20: 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c  ant.  The.** Wal
ea30: 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20  ker.eCode value 
ea40: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74  determines the t
ea50: 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74  ype of "constant
ea60: 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  " we are looking
ea70: 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  .** for..**.** T
ea80: 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f  hese callback ro
ea90: 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
eaa0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
eab0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
eac0: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
ead0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  rIsConstant()   
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
eaf0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31  Walker->eCode==1
eb00: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
eb10: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
eb20: 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20 20  Join()          
eb30: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
eb40: 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =2.**     sqlite
eb50: 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
eb60: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
eb70: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
eb80: 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==3.**     sqli
eb90: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
eba0: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20  tOrFunction()   
ebb0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
ebc0: 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a  ode==4 or 5.**.*
ebd0: 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20  * In all cases, 
ebe0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65  the callbacks se
ebf0: 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30  t Walker.eCode=0
ec00: 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68   and abort if th
ec10: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
ec20: 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20  is found to not 
ec30: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  be a constant..*
ec40: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
ec50: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
ec60: 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73  Function() is us
ec70: 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  ed for evaluatin
ec80: 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  g expressions.**
ec90: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
eca0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
ecb0: 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  he Walker.eCode 
ecc0: 76 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20  value is 5 when 
ecd0: 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78  parsing.** an ex
ece0: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e  isting schema an
ecf0: 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73  d 4 when process
ed00: 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d  ing a new statem
ed10: 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a  ent.  A bound.**
ed20: 20 70 61 72 61 6d 65 74 65 72 20 72 61 69 73 65   parameter raise
ed30: 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e  s an error for n
ed40: 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62  ew statements, b
ed50: 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63  ut is silently c
ed60: 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e  onverted.** to N
ed70: 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ULL for existing
ed80: 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20   schemas.  This 
ed90: 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61  allows sqlite_ma
eda0: 73 74 65 72 20 74 61 62 6c 65 73 20 74 68 61 74  ster tables that
edb0: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62   .** contain a b
edc0: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62  ound parameter b
edd0: 65 63 61 75 73 65 20 74 68 65 79 20 77 65 72 65  ecause they were
ede0: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c   generated by ol
edf0: 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  der versions.** 
ee00: 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20  of SQLite to be 
ee10: 70 61 72 73 65 64 20 62 79 20 6e 65 77 65 72 20  parsed by newer 
ee20: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
ee30: 74 65 20 77 69 74 68 6f 75 74 20 72 61 69 73 69  te without raisi
ee40: 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65  ng a.** malforme
ee50: 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a  d schema error..
ee60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
ee70: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
ee80: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
ee90: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
eea0: 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72  .  /* If pWalker
eeb0: 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68 65  ->eCode is 2 the
eec0: 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68  n any term of th
eed0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
eee0: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a  t comes from.  *
eef0: 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
ef00: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c  G clauses of a l
ef10: 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  eft join disqual
ef20: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
ef30: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
ef40: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
ef50: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
ef60: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
ef70: 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73 50  e==2 && ExprHasP
ef80: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
ef90: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
efa0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
efb0: 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  e = 0;.    retur
efc0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
efd0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
efe0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
eff0: 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f  Consider functio
f000: 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e  ns to be constan
f010: 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61  t if all their a
f020: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e  rguments are con
f030: 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64  stant.    ** and
f040: 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d   either pWalker-
f050: 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f  >eCode==4 or 5 o
f060: 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68  r the function h
f070: 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51  as the.    ** SQ
f080: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20  LITE_FUNC_CONST 
f090: 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73  flag. */.    cas
f0a0: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
f0b0: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
f0c0: 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78  ->eCode>=4 || Ex
f0d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
f0e0: 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63  xpr,EP_ConstFunc
f0f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
f100: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
f110: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f120: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
f130: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
f140: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
f150: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
f160: 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20   case TK_ID:.   
f170: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 74     /* Convert "t
f180: 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22 20  rue" or "false" 
f190: 69 6e 20 61 20 44 45 46 41 55 4c 54 20 63 6c 61  in a DEFAULT cla
f1a0: 75 73 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  use into the.   
f1b0: 20 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74     ** appropriat
f1c0: 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 6f  e TK_TRUEFALSE o
f1d0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
f1e0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
f1f0: 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45  IdToTrueFalse(pE
f200: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
f210: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
f220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f230: 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
f240: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
f250: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
f260: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
f270: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
f280: 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74  LUMN:.      test
f290: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
f2a0: 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20  =TK_ID );.      
f2b0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
f2c0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
f2d0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f2e0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f2f0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
f300: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f310: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
f320: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
f330: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
f340: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f350: 46 69 78 65 64 43 6f 6c 29 20 26 26 20 70 57 61  FixedCol) && pWa
f360: 6c 6b 65 72 2d 3e 65 43 6f 64 65 21 3d 32 20 29  lker->eCode!=2 )
f370: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
f380: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
f390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f3a0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f3b0: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
f3c0: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
f3d0: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
f3e0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
f3f0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
f400: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
f410: 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
f420: 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a 20  K_IF_NULL_ROW:. 
f430: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
f440: 54 45 52 3a 0a 20 20 20 20 20 20 74 65 73 74 63  TER:.      testc
f450: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
f460: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
f470: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
f480: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f  Expr->op==TK_IF_
f490: 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20 20  NULL_ROW );.    
f4a0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
f4b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
f4c0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
f4d0: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
f4e0: 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  LE:.      if( pW
f4f0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20  alker->eCode==5 
f500: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ){.        /* Si
f510: 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62  lently convert b
f520: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20  ound parameters 
f530: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 73 69  that appear insi
f540: 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20  de of CREATE.   
f550: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
f560: 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77  ts into a NULL w
f570: 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20  hen parsing the 
f580: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
f590: 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20   text out.      
f5a0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69    ** of the sqli
f5b0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
f5c0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  */.        pExpr
f5d0: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
f5e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f5f0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
f600: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
f610: 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  A bound paramete
f620: 72 20 69 6e 20 61 20 43 52 45 41 54 45 20 73 74  r in a CREATE st
f630: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69  atement that ori
f640: 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20  ginates from.   
f650: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
f660: 70 72 65 70 61 72 65 28 29 20 63 61 75 73 65 73  prepare() causes
f670: 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
f680: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f690: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
f6a0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
f6b0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
f6c0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
f6d0: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
f6e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f6f0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
f700: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71 6c 69  ELECT ); /* sqli
f710: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
f720: 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f  l() disallows */
f730: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f740: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
f750: 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 71 6c 69  XISTS ); /* sqli
f760: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
f770: 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f  l() disallows */
f780: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
f790: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
f7a0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
f7b0: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
f7c0: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
f7d0: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
f7e0: 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65  ker w;.  w.eCode
f7f0: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
f800: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
f810: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
f820: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
f830: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
f840: 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
f850: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f860: 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63  DEBUG.  w.xSelec
f870: 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c  tCallback2 = sql
f880: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73  ite3SelectWalkAs
f890: 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20  sert2;.#endif.  
f8a0: 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  w.u.iCur = iCur;
f8b0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
f8c0: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
f8d0: 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
f8e0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
f8f0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
f900: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
f910: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
f920: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
f930: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76   and 0 if it inv
f940: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
f950: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
f960: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
f970: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
f980: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
f990: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
f9a0: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
f9b0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
f9c0: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
f9d0: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
f9e0: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
f9f0: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
fa00: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
fa10: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
fa20: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
fa30: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
fa40: 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  p, 1, 0);.}../*.
fa50: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
fa60: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
fa70: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a  urn non-zero if.
fa80: 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 74 68 65 20  **.**   (1) the 
fa90: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
faa0: 6e 73 74 61 6e 74 2c 20 61 6e 64 0a 2a 2a 20 20  nstant, and.**  
fab0: 20 28 32 29 20 74 68 65 20 65 78 70 72 65 73 73   (2) the express
fac0: 69 6f 6e 20 64 6f 65 73 20 6f 72 69 67 69 6e 61  ion does origina
fad0: 74 65 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  te in the ON or 
fae0: 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
faf0: 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
fb00: 4a 4f 49 4e 2c 20 61 6e 64 0a 2a 2a 20 20 20 28  JOIN, and.**   (
fb10: 33 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  3) the expressio
fb20: 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  n does not conta
fb30: 69 6e 20 61 6e 79 20 45 50 5f 46 69 78 65 64 43  in any EP_FixedC
fb40: 6f 6c 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20  ol TK_COLUMN.** 
fb50: 20 20 20 20 20 20 6f 70 65 72 61 6e 64 73 20 63        operands c
fb60: 72 65 61 74 65 64 20 62 79 20 74 68 65 20 63 6f  reated by the co
fb70: 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
fb80: 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  on optimization.
fb90: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
fba0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
fbb0: 20 74 72 75 65 2c 20 69 74 20 69 6e 64 69 63 61   true, it indica
fbc0: 74 65 73 20 74 68 61 74 20 74 68 65 20 65 78 70  tes that the exp
fbd0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ression.** can b
fbe0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  e added to the p
fbf0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
fc00: 72 20 6c 69 73 74 20 61 6e 64 20 65 76 61 6c 75  r list and evalu
fc10: 61 74 65 64 20 6f 6e 63 65 20 77 68 65 6e 0a 2a  ated once when.*
fc20: 2a 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  * the prepared s
fc30: 74 61 74 65 6d 65 6e 74 20 73 74 61 72 74 73 20  tatement starts 
fc40: 75 70 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  up.  See sqlite3
fc50: 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 29  ExprCodeAtInit()
fc60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fc70: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
fc80: 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a  tJoin(Expr *p){.
fc90: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
fca0: 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d  onst(p, 2, 0);.}
fcb0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
fcc0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
fcd0: 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
fce0: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
fcf0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
fd00: 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c  ** for any singl
fd10: 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62  e row of the tab
fd20: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
fd30: 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Cur.  In other w
fd40: 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70  ords, the.** exp
fd50: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  ression must not
fd60: 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f   refer to any no
fd70: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
fd80: 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79  function nor any
fd90: 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20  .** table other 
fda0: 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e  than iCur..*/.in
fdb0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  t sqlite3ExprIsT
fdc0: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70  ableConstant(Exp
fdd0: 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b  r *p, int iCur){
fde0: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
fdf0: 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72  Const(p, 3, iCur
fe00: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  );.}.../*.** sql
fe10: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63  ite3WalkExpr() c
fe20: 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
fe30: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
fe40: 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 29  stantOrGroupBy()
fe50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fe60: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
fe70: 6e 74 4f 72 47 72 6f 75 70 42 79 28 57 61 6c 6b  ntOrGroupBy(Walk
fe80: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
fe90: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
fea0: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20  rList *pGroupBy 
feb0: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 47 72  = pWalker->u.pGr
fec0: 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20 69 3b 0a  oupBy;.  int i;.
fed0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70  .  /* Check if p
fee0: 45 78 70 72 20 69 73 20 69 64 65 6e 74 69 63 61  Expr is identica
fef0: 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55 50 20 42  l to any GROUP B
ff00: 59 20 74 65 72 6d 2e 20 49 66 20 73 6f 2c 20 63  Y term. If so, c
ff10: 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20 69 74 20  onsider.  ** it 
ff20: 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a 20 20  constant.  */.  
ff30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
ff40: 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
ff50: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
ff60: 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
ff70: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71  Expr;.    if( sq
ff80: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
ff90: 28 30 2c 20 70 45 78 70 72 2c 20 70 2c 20 2d 31  (0, pExpr, p, -1
ffa0: 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  )<2 ){.      Col
ffb0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
ffc0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
ffd0: 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72  eq(pWalker->pPar
ffe0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66  se, p);.      if
fff0: 28 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72  ( sqlite3IsBinar
10000 79 28 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  y(pColl) ){.    
10010 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
10020 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
10030 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
10040 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20  eck if pExpr is 
10050 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 66  a sub-select. If
10060 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69 74   so, consider it
10070 20 76 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20   variable. */.  
10080 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
10090 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
100a0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
100b0 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
100c0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   0;.    return W
100d0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
100e0 20 72 65 74 75 72 6e 20 65 78 70 72 4e 6f 64 65   return exprNode
100f0 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b  IsConstant(pWalk
10100 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  er, pExpr);.}../
10110 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65 78  *.** Walk the ex
10120 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 70 61  pression tree pa
10130 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
10140 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
10150 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69  rn non-zero.** i
10160 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10170 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
10180 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20  ly of constants 
10190 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 74 65 72  or copies of ter
101a0 6d 73 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70  ms .** in pGroup
101b0 42 79 20 74 68 61 74 20 73 6f 72 74 20 77 69 74  By that sort wit
101c0 68 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c  h the BINARY col
101d0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
101e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
101f0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
10200 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20 74 65  etermine if a te
10210 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47  rm of the HAVING
10220 20 63 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62   clause can.** b
10230 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20  e promoted into 
10240 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10250 2e 20 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  .  In order for 
10260 73 75 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e  such a promotion
10270 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65   to work,.** the
10280 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 48 41   value of the HA
10290 56 49 4e 47 20 63 6c 61 75 73 65 20 74 65 72 6d  VING clause term
102a0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
102b0 65 20 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72  e for all member
102c0 73 20 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70  s of.** a "group
102d0 22 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d  ".  The requirem
102e0 65 6e 74 20 74 68 61 74 20 74 68 65 20 47 52 4f  ent that the GRO
102f0 55 50 20 42 59 20 74 65 72 6d 20 6d 75 73 74 20  UP BY term must 
10300 62 65 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73  be BINARY.** ass
10310 75 6d 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  umes that no oth
10320 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  er collating seq
10330 75 65 6e 63 65 20 77 69 6c 6c 20 68 61 76 65 20  uence will have 
10340 61 20 66 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a  a finer-grained.
10350 2a 2a 20 67 72 6f 75 70 69 6e 67 20 74 68 61 6e  ** grouping than
10360 20 62 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68   binary.  In oth
10370 65 72 20 77 6f 72 64 73 20 28 41 3d 42 20 43 4f  er words (A=B CO
10380 4c 4c 41 54 45 20 62 69 6e 61 72 79 29 20 69 6d  LLATE binary) im
10390 70 6c 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20  plies.** A=B in 
103a0 65 76 65 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c  every other coll
103b0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ating sequence. 
103c0 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   The requirement
103d0 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f   that the.** GRO
103e0 55 50 20 42 59 20 62 65 20 42 49 4e 41 52 59 20  UP BY be BINARY 
103f0 69 73 20 73 74 72 69 63 74 65 72 20 74 68 61 6e  is stricter than
10400 20 6e 65 63 65 73 73 61 72 79 2e 20 20 49 74 20   necessary.  It 
10410 77 6f 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a  would also work.
10420 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41  ** to promote HA
10430 56 49 4e 47 20 63 6c 61 75 73 65 73 20 74 68 61  VING clauses tha
10440 74 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 61  t use the same a
10450 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
10460 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
10470 20 61 73 20 74 68 65 20 47 52 4f 55 50 20 42 59   as the GROUP BY
10480 20 74 65 72 6d 2c 20 62 75 74 20 74 68 61 74 20   term, but that 
10490 69 73 20 6d 75 63 68 20 68 61 72 64 65 72 20 74  is much harder t
104a0 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65  o check,.** alte
104b0 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
104c0 67 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20  g sequences are 
104d0 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68  uncommon, and th
104e0 69 73 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a  is is only an.**
104f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73   optimization, s
10500 6f 20 77 65 20 74 61 6b 65 20 74 68 65 20 65 61  o we take the ea
10510 73 79 20 77 61 79 20 6f 75 74 20 61 6e 64 20 73  sy way out and s
10520 69 6d 70 6c 79 20 72 65 71 75 69 72 65 20 74 68  imply require th
10530 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 74 6f  e.** GROUP BY to
10540 20 75 73 65 20 74 68 65 20 42 49 4e 41 52 59 20   use the BINARY 
10550 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
10560 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
10570 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
10580 4f 72 47 72 6f 75 70 42 79 28 50 61 72 73 65 20  OrGroupBy(Parse 
10590 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
105a0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f  , ExprList *pGro
105b0 75 70 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20  upBy){.  Walker 
105c0 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31  w;.  w.eCode = 1
105d0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
105e0 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73  ack = exprNodeIs
105f0 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
10600 79 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  y;.  w.xSelectCa
10610 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e  llback = 0;.  w.
10620 75 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  u.pGroupBy = pGr
10630 6f 75 70 42 79 3b 0a 20 20 77 2e 70 50 61 72 73  oupBy;.  w.pPars
10640 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
10650 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
10660 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
10670 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
10680 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
10690 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
106a0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
106b0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
106c0 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
106d0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
106e0 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
106f0 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
10700 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
10710 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
10720 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
10730 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
10740 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
10750 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
10760 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
10770 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
10780 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
10790 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
107a0 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
107b0 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
107c0 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
107d0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
107e0 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
107f0 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29  r *p, u8 isInit)
10800 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e  {.  assert( isIn
10810 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d  it==0 || isInit=
10820 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
10830 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b  xprIsConst(p, 4+
10840 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23  isInit, 0);.}..#
10850 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10860 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
10870 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
10880 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
10890 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
108a0 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
108b0 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65  ains a.** subque
108c0 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  ry of some kind.
108d0 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
108e0 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75  ere are no subqu
108f0 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eries..*/.int sq
10900 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e  lite3ExprContain
10910 73 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a  sSubquery(Expr *
10920 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
10930 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20    w.eCode = 1;. 
10940 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
10950 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
10960 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c  lkNoop;.  w.xSel
10970 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
10980 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
10990 61 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ail;.#ifdef SQLI
109a0 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65  TE_DEBUG.  w.xSe
109b0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
109c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
109d0 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66  kAssert2;.#endif
109e0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
109f0 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
10a00 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a  urn w.eCode==0;.
10a10 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10a20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
10a30 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
10a40 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
10a50 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
10a60 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
10a70 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
10a80 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
10a90 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
10aa0 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
10ab0 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
10ac0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10ad0 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
10ae0 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
10af0 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
10b00 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
10b10 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
10b20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
10b30 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
10b40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
10b50 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
10b60 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
10b70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
10b80 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
10b90 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f  urn 0;  /* Can o
10ba0 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f  nly happen follo
10bb0 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a  wing on OOM */..
10bc0 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65    /* If an expre
10bd0 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
10be0 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ger literal that
10bf0 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65   fits in a signe
10c00 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e  d 32-bit.  ** in
10c10 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
10c20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67  EP_IntValue flag
10c30 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
10c40 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20  dy been set */. 
10c50 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
10c60 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70  TK_INTEGER || (p
10c70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
10c80 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20  Value)!=0.      
10c90 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
10ca0 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f  etInt32(p->u.zTo
10cb0 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a  ken, &rc)==0 );.
10cc0 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
10cd0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
10ce0 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70  .    *pValue = p
10cf0 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
10d00 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
10d10 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
10d20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
10d30 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
10d40 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
10d50 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
10d60 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
10d70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10d80 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
10d90 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
10da0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
10db0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
10dc0 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
10dd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76         assert( v
10de0 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31  !=(-2147483647-1
10df0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) );.        *pV
10e00 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
10e10 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
10e20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10e30 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
10e40 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  t: break;.  }.  
10e50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10e60 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
10e70 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
10e80 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
10e90 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
10ea0 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e NULL..**.** If
10eb0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10ec0 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72  might be NULL or
10ed0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
10ee0 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65  on is too comple
10ef0 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74  x.** to tell ret
10f00 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a  urn TRUE.  .**.*
10f10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10f20 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74  s used as an opt
10f30 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b  imization, to sk
10f40 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63  ip OP_IsNull opc
10f50 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20  odes.** when we 
10f60 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75  know that a valu
10f70 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  e cannot be NULL
10f80 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73  .  Hence, a fals
10f90 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72  e positive.** (r
10fa0 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68  eturning TRUE wh
10fb0 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65  en in fact the e
10fc0 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65  xpression can ne
10fd0 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67  ver be NULL) mig
10fe0 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c  ht.** be a small
10ff0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
11000 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
11010 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20  e harmless.  On 
11020 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e  the other.** han
11030 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74  d, a false negat
11040 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46  ive (returning F
11050 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65  ALSE when the re
11060 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55  sult could be NU
11070 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65  LL).** will like
11080 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
11090 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
110a0 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f  .  So when in do
110b0 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54  ubt, return.** T
110c0 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  RUE..*/.int sqli
110d0 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
110e0 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b  (const Expr *p){
110f0 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c  .  u8 op;.  whil
11100 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
11110 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
11120 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
11130 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
11140 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
11150 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
11160 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
11170 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
11180 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
11190 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
111a0 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
111b0 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
111c0 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  e TK_BLOB:.     
111d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63   return 0;.    c
111e0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
111f0 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72       return Expr
11200 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
11210 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a  P_CanBeNull) ||.
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
11230 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20 52  pTab==0 ||  /* R
11240 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f 6c 75  eference to colu
11250 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e 20 65  mn of index on e
11260 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
11270 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43            (p->iC
11280 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70  olumn>=0 && p->p
11290 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f  Tab->aCol[p->iCo
112a0 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
112b0 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  );.    default:.
112c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
112d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
112e0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
112f0 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
11300 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77   is a constant w
11310 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a  hich would be.**
11320 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50   unchanged by OP
11330 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74  _Affinity with t
11340 68 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65  he affinity give
11350 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  n in the second.
11360 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
11370 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11380 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
11390 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41  mine if the OP_A
113a0 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f  ffinity operatio
113b0 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74  n.** can be omit
113c0 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f  ted.  When in do
113d0 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ubt return FALSE
113e0 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74  .  A false negat
113f0 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65  ive.** is harmle
11400 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73  ss.  A false pos
11410 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20  itive, however, 
11420 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68  can result in th
11430 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65  e wrong.** answe
11440 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
11450 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
11460 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74  nityChange(const
11470 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61   Expr *p, char a
11480 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  ff){.  u8 op;.  
11490 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  if( aff==SQLITE_
114a0 41 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72  AFF_BLOB ) retur
114b0 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  n 1;.  while( p-
114c0 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
114d0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
114e0 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
114f0 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
11500 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
11510 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
11520 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
11530 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
11540 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
11550 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
11560 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
11570 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  GER || aff==SQLI
11580 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
11590 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
115a0 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
115b0 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
115c0 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20  ITE_AFF_REAL || 
115d0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
115e0 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20  NUMERIC;.    }. 
115f0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
11600 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  G: {.      retur
11610 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
11620 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  F_TEXT;.    }.  
11630 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
11640 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
11650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11660 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
11670 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
11680 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  Table>=0 );  /* 
11690 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74  p cannot be part
116a0 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73   of a CHECK cons
116b0 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
116c0 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d  return p->iColum
116d0 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  n<0.          &&
116e0 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
116f0 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
11700 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
11710 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ERIC);.    }.   
11720 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
11730 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
11740 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
11750 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
11760 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69  e given string i
11770 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d  s a row-id colum
11780 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73  n name..*/.int s
11790 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f  qlite3IsRowid(co
117a0 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
117b0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
117c0 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29  mp(z, "_ROWID_")
117d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
117e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
117f0 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29  ICmp(z, "ROWID")
11800 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
11810 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
11820 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d  ICmp(z, "OID")==
11830 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
11840 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
11850 2a 2a 20 70 58 20 69 73 20 74 68 65 20 52 48 53  ** pX is the RHS
11860 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   of an IN operat
11870 6f 72 2e 20 20 49 66 20 70 58 20 69 73 20 61 20  or.  If pX is a 
11880 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11890 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65   .** that can be
118a0 20 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61   simplified to a
118b0 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 61 63   direct table ac
118c0 63 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72  cess, then retur
118d0 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
118e0 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  o the SELECT sta
118f0 74 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69  tement.  If pX i
11900 73 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73  s not a SELECT s
11910 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20  tatement,.** or 
11920 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  if the SELECT st
11930 61 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f  atement needs to
11940 20 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69   be manifested i
11950 6e 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a  nto a transient.
11960 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72  ** table, then r
11970 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23  eturn NULL..*/.#
11980 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11990 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74  IT_SUBQUERY.stat
119a0 69 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e  ic Select *isCan
119b0 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45  didateForInOpt(E
119c0 78 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65  xpr *pX){.  Sele
119d0 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74  ct *p;.  SrcList
119e0 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69   *pSrc;.  ExprLi
119f0 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61  st *pEList;.  Ta
11a00 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
11a10 20 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   i;.  if( !ExprH
11a20 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
11a30 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72  P_xIsSelect) ) r
11a40 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74  eturn 0;  /* Not
11a50 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20   a subquery */. 
11a60 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
11a70 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53  erty(pX, EP_VarS
11a80 65 6c 65 63 74 29 20 20 29 20 72 65 74 75 72 6e  elect)  ) return
11a90 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74   0;  /* Correlat
11aa0 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d  ed subq */.  p =
11ab0 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a   pX->x.pSelect;.
11ac0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
11ad0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
11ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
11af0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
11b00 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65  T */.  if( p->se
11b10 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
11b20 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
11b30 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63  te) ){.    testc
11b40 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
11b50 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
11b60 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
11b70 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
11b80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
11b90 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
11ba0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
11bb0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
11bc0 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65  regate );.    re
11bd0 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49  turn 0; /* No DI
11be0 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61  STINCT keyword a
11bf0 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  nd no aggregate 
11c00 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d  functions */.  }
11c10 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47  .  assert( p->pG
11c20 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20  roupBy==0 );    
11c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
11c40 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
11c50 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
11c60 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
11c70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11c80 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20  /* Has no LIMIT 
11c90 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
11ca0 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
11cb0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
11cc0 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45     /* Has no WHE
11cd0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70  RE clause */.  p
11ce0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
11cf0 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
11d00 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   );.  if( pSrc->
11d10 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
11d20 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
11d30 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46  Single term in F
11d40 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
11d50 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  if( pSrc->a[0].p
11d60 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
11d70 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69  0;     /* FROM i
11d80 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  s not a subquery
11d90 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54   or view */.  pT
11da0 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  ab = pSrc->a[0].
11db0 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  pTab;.  assert( 
11dc0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
11dd0 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65  ert( pTab->pSele
11de0 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  ct==0 );        
11df0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
11e00 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  se is not a view
11e10 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
11e20 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
11e30 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  rn 0;        /* 
11e40 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20  FROM clause not 
11e50 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
11e60 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
11e70 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  >pEList;.  asser
11e80 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
11e90 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20    /* All SELECT 
11ea0 72 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20  results must be 
11eb0 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f  columns. */.  fo
11ec0 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
11ed0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11ee0 20 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70    Expr *pRes = p
11ef0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
11f00 72 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d  r;.    if( pRes-
11f10 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
11f20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61   return 0;.    a
11f30 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61  ssert( pRes->iTa
11f40 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e  ble==pSrc->a[0].
11f50 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e  iCursor );  /* N
11f60 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  ot a correlated 
11f70 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a  subquery */.  }.
11f80 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65    return p;.}.#e
11f90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11fa0 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
11fb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11fc0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
11fd0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
11fe0 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68  e that checks th
11ff0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
12000 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c  mn of index tabl
12010 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69 66  e iCur to see if
12020 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  .** it contains 
12030 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73  any NULL entries
12040 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65 67  .  Cause the reg
12050 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73 4e  ister at regHasN
12060 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a  ull to be set.**
12070 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   to a non-NULL v
12080 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e  alue if iCur con
12090 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20  tains no NULLs. 
120a0 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72 20   Cause register 
120b0 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f  regHasNull.** to
120c0 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
120d0 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
120e0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
120f0 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  L values..*/.sta
12100 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
12110 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56  SetHasNullFlag(V
12120 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72  dbe *v, int iCur
12130 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c  , int regHasNull
12140 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a  ){.  int addr1;.
12150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12160 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12170 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
12180 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
12190 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
121a0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  , OP_Rewind, iCu
121b0 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
121c0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
121d0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
121e0 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20  olumn, iCur, 0, 
121f0 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73  regHasNull);.  s
12200 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12210 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50  P5(v, OPFLAG_TYP
12220 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43  EOFARG);.  VdbeC
12230 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73  omment((v, "firs
12240 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c  t_entry_in(%d)",
12250 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74   iCur));.  sqlit
12260 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12270 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64  , addr1);.}.#end
12280 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
12290 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
122a0 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  Y./*.** The argu
122b0 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70  ment is an IN op
122c0 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69  erator with a li
122d0 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65  st (not a subque
122e0 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72  ry) on the .** r
122f0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20  ight-hand side. 
12300 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
12310 74 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e  that list is con
12320 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  stant..*/.static
12330 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68   int sqlite3InRh
12340 73 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  sIsConstant(Expr
12350 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a   *pIn){.  Expr *
12360 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b  pLHS;.  int res;
12370 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
12380 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c  HasProperty(pIn,
12390 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
123a0 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e  ;.  pLHS = pIn->
123b0 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c  pLeft;.  pIn->pL
123c0 65 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d  eft = 0;.  res =
123d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
123e0 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70  nstant(pIn);.  p
123f0 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53  In->pLeft = pLHS
12400 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
12410 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
12420 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12430 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70   used by the imp
12440 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
12450 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72  he IN (...) oper
12460 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20  ator..** The pX 
12470 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
12480 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74   expression on t
12490 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
124a0 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68   operator, which
124b0 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74  .** might be eit
124c0 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78  her a list of ex
124d0 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73  pressions or a s
124e0 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  ubquery..**.** T
124f0 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
12500 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e  outine is to fin
12510 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d  d or create a b-
12520 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
12530 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
12540 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66  either to test f
12550 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e  or membership in
12560 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72 20   the RHS set or 
12570 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
12580 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72  gh.** all member
12590 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74  s of the RHS set
125a0 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
125b0 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63  cates..**.** A c
125c0 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20  ursor is opened 
125d0 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  on the b-tree ob
125e0 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68 65  ject that is the
125f0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
12600 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70  perator.** and p
12610 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74  X->iTable is set
12620 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
12630 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a   that cursor..**
12640 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
12650 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
12660 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65  unction indicate
12670 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70  s the b-tree typ
12680 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  e, as follows:.*
12690 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  *.**   IN_INDEX_
126a0 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68 65  ROWID      - The
126b0 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
126c0 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
126d0 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
126e0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
126f0 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
12700 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61  s opened on an a
12710 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a  scending index..
12720 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
12730 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63  DEX_DESC - The c
12740 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
12750 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
12760 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
12770 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20 20  INDEX_EPH       
12780 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
12790 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70  s opened on a sp
127a0 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20  ecially created 
127b0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
127c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
127d0 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
127e0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49  al table..**   I
127f0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20  N_INDEX_NOOP    
12800 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77     - No cursor w
12810 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54  as allocated.  T
12820 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d  he IN operator m
12830 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  ust be.**       
12840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12850 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73    implemented as
12860 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63   a sequence of c
12870 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a  omparisons..**.*
12880 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d  * An existing b-
12890 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75 73  tree might be us
128a0 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65 78  ed if the RHS ex
128b0 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61  pression pX is a
128c0 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75   simple.** subqu
128d0 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a  ery such as:.**.
128e0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63  **     SELECT <c
128f0 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e  olumn1>, <column
12900 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c  2>... FROM <tabl
12910 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e>.**.** If the 
12920 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
12930 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
12940 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c   or a more compl
12950 65 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65  ex subquery, the
12960 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61  n.** an ephemera
12970 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65  l table might ne
12980 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  ed to be generat
12990 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20  ed from the RHS 
129a0 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e  and then.** pX->
129b0 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70  iTable made to p
129c0 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65  oint to the ephe
129d0 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74  meral table inst
129e0 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69  ead of an.** exi
129f0 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a  sting table..**.
12a00 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70  ** The inFlags p
12a10 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f  arameter must co
12a20 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69  ntain, at a mini
12a30 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20  mum, one of the 
12a40 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  bits.** IN_INDEX
12a50 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49  _MEMBERSHIP or I
12a60 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74  N_INDEX_LOOP but
12a70 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49 66 20 69   not both.  If i
12a80 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a  nFlags contains.
12a90 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  ** IN_INDEX_MEMB
12aa0 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65  ERSHIP, then the
12ab0 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
12ac0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
12ad0 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62  r a fast.** memb
12ae0 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68  ership test.  Wh
12af0 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  en the IN_INDEX_
12b00 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c  LOOP bit is set,
12b10 20 74 68 65 20 49 4e 20 69 6e 64 65 78 20 77 69   the IN index wi
12b20 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  ll.** be used to
12b30 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76   loop over all v
12b40 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53  alues of the RHS
12b50 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
12b60 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  tor..**.** When 
12b70 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73  IN_INDEX_LOOP is
12b80 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62   used (and the b
12b90 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
12ba0 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a  ed to iterate.**
12bb0 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74   through the set
12bc0 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74   members) then t
12bd0 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e  he b-tree must n
12be0 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69  ot contain dupli
12bf0 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68  cates..** An eph
12c00 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c  eremal table wil
12c10 6c 20 62 65 20 63 72 65 61 74 65 64 20 75 6e 6c  l be created unl
12c20 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
12c30 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61   columns are gua
12c40 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
12c50 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
12c60 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
12c70 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
12c80 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a  Y KEY or due to.
12c90 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73  ** a UNIQUE cons
12ca0 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e  traint or index.
12cb0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
12cc0 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
12cd0 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
12ce0 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
12cf0 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
12d00 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
12d10 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20   tests) then an 
12d20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
12d30 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
12d40 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73   unless <columns
12d50 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e  > is a single IN
12d60 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
12d70 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a  Y column or an .
12d80 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  ** index can be 
12d90 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73  found with the s
12da0 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e  pecified <column
12db0 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  s> as its left-m
12dc0 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ost..**.** If th
12dd0 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  e IN_INDEX_NOOP_
12de0 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  OK and IN_INDEX_
12df0 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62  MEMBERSHIP are b
12e00 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69  oth set and.** i
12e10 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
12e20 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
12e30 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
12e40 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69  bquery) then thi
12e50 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67  s.** routine mig
12e60 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63  ht decide that c
12e70 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
12e80 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20  eral b-tree for 
12e90 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65  membership.** te
12ea0 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70  sting is too exp
12eb0 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72  ensive and retur
12ec0 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
12ed0 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
12ee0 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  the.** calling r
12ef0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d  outine should im
12f00 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f  plement the IN o
12f10 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20  perator using a 
12f20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45  sequence.** of E
12f30 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73  q or Ne comparis
12f40 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  on operations..*
12f50 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d  *.** When the b-
12f60 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73  tree is being us
12f70 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ed for membershi
12f80 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c  p tests, the cal
12f90 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
12fa0 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b   might need to k
12fb0 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
12fc0 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20  ot the RHS side 
12fd0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
12fe0 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  or.** contains a
12ff0 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73   NULL.  If prRhs
13000 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61  HasNull is not a
13010 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e   NULL pointer an
13020 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  d .** if there i
13030 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61  s any chance tha
13040 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68  t the (...) migh
13050 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
13060 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
13070 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
13080 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
13090 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
130a0 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
130b0 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48  en.** to *prRhsH
130c0 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65  asNull. If there
130d0 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
130e0 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e  at the (...) con
130f0 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
13100 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52  value, then *prR
13110 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66  hsHasNull is lef
13120 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
13130 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
13140 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
13150 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73  d its location s
13160 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48  tored in *prRhsH
13170 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20  asNull, then.** 
13180 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61  the value in tha
13190 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20  t register will 
131a0 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62  be NULL if the b
131b0 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f  -tree contains o
131c0 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55  ne or more.** NU
131d0 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69  LL values, and i
131e0 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e  t will be some n
131f0 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
13200 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74   the b-tree cont
13210 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20  ains no.** NULL 
13220 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  values..**.** If
13230 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d   the aiMap param
13240 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  eter is not NULL
13250 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  , it must point 
13260 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74  to an array cont
13270 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c  aining.** one el
13280 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63  ement for each c
13290 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62  olumn returned b
132a0 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
132b0 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48  tement on the RH
132c0 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e  S.** of the IN(.
132d0 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68  ..) operator. Th
132e0 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20  e i'th entry of 
132f0 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70  the array is pop
13300 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ulated with the.
13310 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  ** offset of the
13320 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
13330 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
13340 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72  'th column retur
13350 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45  ned by the.** SE
13360 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c  LECT. For exampl
13370 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73  e, if the expres
13380 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65  sion and selecte
13390 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a  d index are:.**.
133a0 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20  **   (?,?,?) IN 
133b0 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20  (SELECT a, b, c 
133c0 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52  FROM t1).**   CR
133d0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
133e0 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a   t1(b, c, a);.**
133f0 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d  .** then aiMap[]
13400 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
13410 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f  th {2, 0, 1}..*/
13420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13430 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
13440 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  t sqlite3FindInI
13450 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
13460 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
13470 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
13480 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
13490 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pX,            
134a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
134b0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
134c0 53 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  S) of the IN ope
134d0 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69  rator */.  u32 i
134e0 6e 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  nFlags,         
134f0 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45        /* IN_INDE
13500 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53  X_LOOP, _MEMBERS
13510 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f  HIP, and/or _NOO
13520 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  P_OK */.  int *p
13530 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20  rRhsHasNull,    
13540 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
13550 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74   holding NULL st
13560 61 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73  atus.  See notes
13570 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
135a0 20 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f   Index fields to
135b0 20 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29   RHS fields */.)
135c0 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
135f0 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
13600 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
13610 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
13620 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
13630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
13640 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
13650 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
13660 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
13670 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
13680 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
13690 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
136a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
136b0 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20  eUnique;        
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
136d0 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
136e0 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
136f0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
13700 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13710 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
13720 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
13730 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
13740 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
13750 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71   );.  mustBeUniq
13760 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20  ue = (inFlags & 
13770 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d  IN_INDEX_LOOP)!=
13780 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
13790 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e  RHS of this IN(.
137a0 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ..) operator is 
137b0 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66  a SELECT, and if
137c0 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a   it matters .  *
137d0 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
137e0 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75   the SELECT resu
137f0 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  lt contains NULL
13800 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77   values, check w
13810 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
13820 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61  ot NULL is actua
13830 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74  lly possible (it
13840 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72   may not be, for
13850 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20   example, due . 
13860 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20   ** to NOT NULL 
13870 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
13880 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e  he schema). If n
13890 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
138a0 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a  e possible,.  **
138b0 20 73 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c   set prRhsHasNul
138c0 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f  l to 0 before co
138d0 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20  ntinuing.  */.  
138e0 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
138f0 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20 26   && (pX->flags &
13900 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
13910 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
13920 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
13930 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  t = pX->x.pSelec
13940 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66  t->pEList;.    f
13950 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
13960 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
13970 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
13980 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45  ExprCanBeNull(pE
13990 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
139a0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
139b0 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69  .    if( i==pELi
139c0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
139d0 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20     prRhsHasNull 
139e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
139f0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
13a00 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
13a10 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
13a20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
13a30 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
13a40 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
13a50 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
13a60 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
13a70 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
13a80 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  able.  */.  if( 
13a90 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
13aa0 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64  && (p = isCandid
13ab0 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29  ateForInOpt(pX))
13ac0 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
13ad0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
13ae0 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
13af0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
13b00 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nnection */.    
13b10 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
13b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b30 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
13b40 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
13b50 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20  i16 iDb;        
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
13b80 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20  se idx for pTab 
13b90 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
13ba0 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  *pEList = p->pEL
13bb0 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78  ist;.    int nEx
13bc0 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
13bd0 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  pr;..    assert(
13be0 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c00 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
13c10 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
13c20 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
13c30 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
13c40 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20  .pExpr!=0 ); /* 
13c50 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
13c60 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
13c70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
13c80 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20   p->pSrc!=0 );  
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13ca0 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
13cb0 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
13cc0 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  ) */.    pTab = 
13cd0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
13ce0 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65  ab;..    /* Code
13cf0 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69   an OP_Transacti
13d00 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c  on and OP_TableL
13d10 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e  ock for <table>.
13d20 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
13d30 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
13d40 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
13d50 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  hema);.    sqlit
13d60 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
13d70 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
13d80 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
13d90 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
13da0 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
13db0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
13dc0 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 20  .    assert(v); 
13dd0 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64   /* sqlite3GetVd
13de0 62 65 28 29 20 68 61 73 20 61 6c 77 61 79 73 20  be() has always 
13df0 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
13e00 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66  called */.    if
13e10 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45  ( nExpr==1 && pE
13e20 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
13e30 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
13e40 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49       /* The "x I
13e50 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20  N (SELECT rowid 
13e60 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73  FROM table)" cas
13e70 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  e */.      int i
13e80 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
13e90 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
13ea0 6e 63 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  nce);.      Vdbe
13eb0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
13ec0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
13ed0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
13ee0 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
13ef0 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
13f00 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
13f10 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20  EX_ROWID;..     
13f20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13f30 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
13f40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13f50 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
13f80 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
13f90 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
13fa0 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  _ok = 1;.      i
13fb0 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nt i;..      /* 
13fc0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  Check that the a
13fd0 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c  ffinity that wil
13fe0 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72  l be used to per
13ff0 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20 20 20  form each .     
14000 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   ** comparison i
14010 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
14020 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 65 61  e affinity of ea
14030 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62  ch column in tab
14040 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
14050 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
14060 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 69   operator.  If i
14070 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  t not, it is not
14080 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20 20 20   possible to.   
14090 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e     ** use any in
140a0 64 65 78 20 6f 66 20 74 68 65 20 52 48 53 20 74  dex of the RHS t
140b0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  able.  */.      
140c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
140d0 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b   && affinity_ok;
140e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
140f0 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
14100 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
14110 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
14120 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   i);.        int
14130 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e   iCol = pEList->
14140 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[i].pExpr->iCol
14150 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61  umn;.        cha
14160 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c 69 74  r idxaff = sqlit
14170 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66  e3TableColumnAff
14180 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f 6c 29  inity(pTab,iCol)
14190 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65 20 2a  ; /* RHS table *
141a0 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  /.        char c
141b0 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43  mpaff = sqlite3C
141c0 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
141d0 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a 20 20  Lhs, idxaff);.  
141e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
141f0 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  cmpaff==SQLITE_A
14200 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20  FF_BLOB );.     
14210 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70     testcase( cmp
14220 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
14230 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
14240 73 77 69 74 63 68 28 20 63 6d 70 61 66 66 20 29  switch( cmpaff )
14250 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
14260 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
14270 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  :.            br
14280 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eak;.          c
14290 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
142a0 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20  EXT:.           
142b0 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d 70 61   /* sqlite3Compa
142c0 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c  reAffinity() onl
142d0 79 20 72 65 74 75 72 6e 73 20 54 45 58 54 20 69  y returns TEXT i
142e0 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  f one side or th
142f0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
14300 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20 61 66   other has no af
14310 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65 20 6f  finity and the o
14320 74 68 65 72 20 73 69 64 65 20 69 73 20 54 45 58  ther side is TEX
14330 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20 20 20  T.  Hence,.     
14340 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e         ** the on
14350 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70 61 66  ly way for cmpaf
14360 66 20 74 6f 20 62 65 20 54 45 58 54 20 69 73 20  f to be TEXT is 
14370 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20 62 65  for idxaff to be
14380 20 54 45 58 54 0a 20 20 20 20 20 20 20 20 20 20   TEXT.          
14390 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74 68 65    ** and for the
143a0 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53   term on the LHS
143b0 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20 68 61   of the IN to ha
143c0 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20  ve no affinity. 
143d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  */.            a
143e0 73 73 65 72 74 28 20 69 64 78 61 66 66 3d 3d 53  ssert( idxaff==S
143f0 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
14400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
14410 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64  eak;.          d
14420 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
14430 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20      affinity_ok 
14440 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  = sqlite3IsNumer
14450 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 61 66  icAffinity(idxaf
14460 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  f);.        }.  
14470 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
14480 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a   affinity_ok ){.
14490 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
144a0 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
144b0 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 69 6c  g index that wil
144c0 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69 73 20  l work for this 
144d0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
144e0 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
144f0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
14500 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 3b 20  dx && eType==0; 
14510 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
14520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  ){.          Bit
14530 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20  mask colUsed;   
14540 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66     /* Columns of
14550 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
14560 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  */.          Bit
14570 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20  mask mCol;      
14580 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74     /* Mask for t
14590 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d  he current colum
145a0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  n */.          i
145b0 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
145c0 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69 6e 75  <nExpr ) continu
145d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;.          /* 
145e0 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20  Maximum nColumn 
145f0 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d  is BMS-2, not BM
14600 53 2d 31 2c 20 73 6f 20 74 68 61 74 20 77 65 20  S-1, so that we 
14610 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20 20  can compute.    
14620 20 20 20 20 20 20 2a 2a 20 42 49 54 4d 41 53 4b        ** BITMASK
14630 28 6e 45 78 70 72 29 20 77 69 74 68 6f 75 74 20  (nExpr) without 
14640 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20  overflowing */. 
14650 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
14660 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  e( pIdx->nColumn
14670 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20  ==BMS-2 );.     
14680 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
14690 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d  Idx->nColumn==BM
146a0 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  S-1 );.         
146b0 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
146c0 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e 74  mn>=BMS-1 ) cont
146d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
146e0 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65  if( mustBeUnique
146f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14700 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  if( pIdx->nKeyCo
14710 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  l>nExpr.        
14720 20 20 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e 43       ||(pIdx->nC
14730 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20 21  olumn>nExpr && !
14740 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
14750 64 78 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  dx)).           
14760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14770 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
14780 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f  This index is no
14790 74 20 75 6e 69 71 75 65 20 6f 76 65 72 20 74 68  t unique over th
147a0 65 20 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e 73  e IN RHS columns
147b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
147c0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
147d0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73  .          colUs
147e0 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6c  ed = 0;   /* Col
147f0 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 20 75 73  umns of index us
14800 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  ed so far */.   
14810 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
14820 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  i<nExpr; i++){. 
14830 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
14840 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56  *pLhs = sqlite3V
14850 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
14860 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b  r(pX->pLeft, i);
14870 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
14880 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73 74  r *pRhs = pEList
14890 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
148a0 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
148b0 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65  q *pReq = sqlite
148c0 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
148d0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
148e0 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20  hs, pRhs);.     
148f0 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
14900 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
14910 65 72 74 28 20 70 52 65 71 21 3d 30 20 7c 7c 20  ert( pReq!=0 || 
14920 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58  pRhs->iColumn==X
14930 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 61 72 73  N_ROWID || pPars
14940 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20 20  e->nErr );.     
14950 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
14960 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  j<nExpr; j++){. 
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
14980 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
14990 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d  j]!=pRhs->iColum
149a0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
149b0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
149c0 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  rt( pIdx->azColl
149d0 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  [j] );.         
149e0 20 20 20 20 20 69 66 28 20 70 52 65 71 21 3d 30       if( pReq!=0
149f0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
14a00 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20  mp(pReq->zName, 
14a10 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  pIdx->azColl[j])
14a20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
14a30 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
14a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
14a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
14a60 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14a70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
14a80 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62  if( j==nExpr ) b
14a90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14aa0 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49 54    mCol = MASKBIT
14ab0 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (j);.           
14ac0 20 69 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c 55   if( mCol & colU
14ad0 73 65 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20  sed ) break; /* 
14ae0 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65 64  Each column used
14af0 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20 20   only once */.  
14b00 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65            colUse
14b10 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20 20  d |= mCol;.     
14b20 20 20 20 20 20 20 20 69 66 28 20 61 69 4d 61 70         if( aiMap
14b30 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b   ) aiMap[i] = j;
14b40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  .          }.  .
14b50 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
14b60 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63 6f  ( i==nExpr || co
14b70 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42 49 54 28  lUsed!=(MASKBIT(
14b80 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a 20 20 20  nExpr)-1) );.   
14b90 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 55 73         if( colUs
14ba0 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78  ed==(MASKBIT(nEx
14bb0 70 72 29 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  pr)-1) ){.      
14bc0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
14bd0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
14be0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
14bf0 69 6e 64 65 78 20 70 49 64 78 20 69 73 20 75 73  index pIdx is us
14c00 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
14c10 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20      int iAddr = 
14c20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14c30 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
14c40 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14c50 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 6c              Expl
14c60 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
14c70 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  arse, 0,.       
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c90 20 20 20 20 20 20 20 22 55 53 49 4e 47 20 49 4e         "USING IN
14ca0 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50  DEX %s FOR IN-OP
14cb0 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e  ERATOR",pIdx->zN
14cc0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
14cd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14ce0 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
14cf0 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
14d00 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
14d10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14d20 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
14d30 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
14d40 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
14d50 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
14d60 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
14d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
14d80 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
14d90 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
14da0 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
14db0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
14dc0 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
14dd0 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64  _INDEX_ASC + pId
14de0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
14df0 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  ;.  .           
14e00 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
14e10 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  l ){.#ifdef SQLI
14e20 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
14e30 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
14e40 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61 73           i64 mas
14e50 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31  k = (1<<nExpr)-1
14e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14e70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14e80 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
14e90 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20  mnsUsed, .      
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
14eb0 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61  , 0, 0, (u8*)&ma
14ec0 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  sk, P4_INT64);.#
14ed0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
14ee0 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c      *prRhsHasNul
14ef0 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
14f00 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
14f10 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29    if( nExpr==1 )
14f20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
14f30 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e    sqlite3SetHasN
14f40 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c  ullFlag(v, iTab,
14f50 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b   *prRhsHasNull);
14f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
14f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
14f80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14f90 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
14fa0 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
14fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
14fc0 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* End loop over
14fd0 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20   indexes */.    
14fe0 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61    } /* End if( a
14ff0 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a  ffinity_ok ) */.
15000 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20      } /* End if 
15010 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64  not an rowid ind
15020 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64  ex */.  } /* End
15030 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69   attempt to opti
15040 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e  mize using an in
15050 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  dex */..  /* If 
15060 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69  no preexisting i
15070 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c  ndex is availabl
15080 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61  e for the IN cla
15090 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f  use.  ** and IN_
150a0 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e  INDEX_NOOP is an
150b0 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20   allowed reply. 
150c0 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
150d0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
150e0 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f  or is a list, no
150f0 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a  t a subquery.  *
15100 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73  * and the RHS is
15110 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72   not constant or
15120 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65   has two or fewe
15130 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68  r terms,.  ** th
15140 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72  en it is not wor
15150 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65  th creating an e
15160 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
15170 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20  o evaluate.  ** 
15180 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
15190 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  so return IN_IND
151a0 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20  EX_NOOP..  */.  
151b0 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20  if( eType==0.   
151c0 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e  && (inFlags & IN
151d0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a  _INDEX_NOOP_OK).
151e0 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
151f0 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
15200 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28  sSelect).   && (
15210 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43  !sqlite3InRhsIsC
15220 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70  onstant(pX) || p
15230 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  X->x.pList->nExp
15240 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65  r<=2).  ){.    e
15250 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
15260 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
15270 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   eType==0 ){.   
15280 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69   /* Could not fi
15290 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  nd an existing t
152a0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
152b0 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20   use as the RHS 
152c0 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57  b-tree..    ** W
152d0 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67  e will have to g
152e0 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d  enerate an ephem
152f0 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f  eral table to do
15300 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f   the job..    */
15310 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e 51  .    u32 savedNQ
15320 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
15330 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
15340 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e     int rMayHaveN
15350 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79  ull = 0;.    eTy
15360 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50  pe = IN_INDEX_EP
15370 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61  H;.    if( inFla
15380 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  gs & IN_INDEX_LO
15390 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  OP ){.      pPar
153a0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
153b0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58   0;.      if( pX
153c0 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ->pLeft->iColumn
153d0 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72  <0 && !ExprHasPr
153e0 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
153f0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
15400 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
15410 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NDEX_ROWID;.    
15420 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
15430 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29  ( prRhsHasNull )
15440 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48 61  {.      *prRhsHa
15450 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65  sNull = rMayHave
15460 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
15470 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  >nMem;.    }.   
15480 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
15490 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58  elect(pParse, pX
154a0 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20  , rMayHaveNull, 
154b0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
154c0 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72  ROWID);.    pPar
154d0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
154e0 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
154f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
15500 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  X->iTable = iTab
15510 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d  ;.  }..  if( aiM
15520 61 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f  ap && eType!=IN_
15530 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
15540 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44  && eType!=IN_IND
15550 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b  EX_INDEX_DESC ){
15560 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
15570 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78     n = sqlite3Ex
15580 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d  prVectorSize(pX-
15590 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72  >pLeft);.    for
155a0 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20  (i=0; i<n; i++) 
155b0 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20  aiMap[i] = i;.  
155c0 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
155d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
155e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
155f0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41  SUBQUERY./*.** A
15600 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73  rgument pExpr is
15610 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e   an (?, ?...) IN
15620 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
15630 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
15640 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
15650 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d  d returns a nul-
15660 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
15670 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a  g containing .**
15680 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20   the affinities 
15690 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
156a0 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
156b0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a  e comparison..**
156c0 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
156d0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
156e0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
156f0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
15700 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67  turned.** string
15710 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
15720 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
15730 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  e3DbFree()..*/.s
15740 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72  tatic char *expr
15750 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  INAffinity(Parse
15760 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
15770 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a  pExpr){.  Expr *
15780 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
15790 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  Left;.  int nVal
157a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
157b0 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
157c0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
157d0 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61  ct = (pExpr->fla
157e0 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
157f0 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53  t) ? pExpr->x.pS
15800 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61  elect : 0;.  cha
15810 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65  r *zRet;..  asse
15820 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
15830 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d  K_IN );.  zRet =
15840 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
15850 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Raw(pParse->db, 
15860 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a  nVal+1);.  if( z
15870 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
15880 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
15890 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
158a0 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71     Expr *pA = sq
158b0 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
158c0 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
158d0 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 20  );.      char a 
158e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
158f0 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20  inity(pA);.     
15900 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
15910 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
15920 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
15930 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74  Affinity(pSelect
15940 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
15950 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20  Expr, a);.      
15960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
15970 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20  Ret[i] = a;.    
15980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52    }.    }.    zR
15990 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b  et[nVal] = '\0';
159a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
159b0 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  et;.}.#endif..#i
159c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
159d0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
159e0 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65 20   Load the Parse 
159f0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
15a00 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
15a10 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ent with an erro
15a20 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66  r .** message of
15a30 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
15a40 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72     "sub-select r
15a50 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73  eturns N columns
15a60 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a   - expected M".*
15a70 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
15a80 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
15a90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
15aa0 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20  nt nActual, int 
15ab0 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73  nExpect){.  cons
15ac0 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22  t char *zFmt = "
15ad0 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
15ae0 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20  ns %d columns - 
15af0 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20  expected %d";.  
15b00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15b10 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41  pParse, zFmt, nA
15b20 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b  ctual, nExpect);
15b30 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15b40 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   Expression pExp
15b50 72 20 69 73 20 61 20 76 65 63 74 6f 72 20 74 68  r is a vector th
15b60 61 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64  at has been used
15b70 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77 68   in a context wh
15b80 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  ere.** it is not
15b90 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20 70   permitted. If p
15ba0 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65  Expr is a sub-se
15bb0 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68 69  lect vector, thi
15bc0 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f  s routine .** lo
15bd0 61 64 73 20 74 68 65 20 50 61 72 73 65 20 6f 62  ads the Parse ob
15be0 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65 73 73  ject with a mess
15bf0 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
15c00 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
15c10 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
15c20 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
15c30 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  d 1".**.** Or, i
15c40 66 20 69 74 20 69 73 20 61 20 72 65 67 75 6c 61  f it is a regula
15c50 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72 3a  r scalar vector:
15c60 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61  .**.**   "row va
15c70 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20  lue misused".*/ 
15c80 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56    .void sqlite3V
15c90 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50 61  ectorErrorMsg(Pa
15ca0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
15cb0 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e 64  r *pExpr){.#ifnd
15cc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
15cd0 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70 45  UBQUERY.  if( pE
15ce0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
15cf0 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  xIsSelect ){.   
15d00 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
15d10 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
15d20 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
15d30 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
15d40 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  1);.  }else.#end
15d50 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
15d60 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15d70 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
15d80 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  sused");.  }.}..
15d90 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
15da0 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
15db0 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
15dc0 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70  s a subquery exp
15dd0 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c  ression, EXISTS,
15de0 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74  .** or IN operat
15df0 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
15e00 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
15e10 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
15e20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
15e30 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
15e40 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
15e50 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
15e60 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
15e70 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
15e80 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
15e90 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
15ea0 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
15eb0 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
15ec0 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
15ed0 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
15ee0 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
15ef0 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
15f00 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
15f10 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
15f20 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
15f30 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
15f40 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
15f50 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
15f60 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
15f70 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e  ter isRowid is n
15f80 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78  on-zero, then ex
15f90 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
15fa0 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
15fb0 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  to be of the for
15fc0 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f  m "<rowid> IN (?
15fd0 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20  , ?, ?)", where 
15fe0 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66  <rowid> is a ref
15ff0 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d  erence.** to som
16000 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f  e integer key co
16010 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20  lumn of a table 
16020 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
16030 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20  case, use an.** 
16040 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f  intkey B-Tree to
16050 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
16060 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73  f IN(...) values
16070 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
16080 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72  usual.** (slower
16090 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  ) variable lengt
160a0 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a  h keys B-Tree..*
160b0 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65  *.** If rMayHave
160c0 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Null is non-zero
160d0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
160e0 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  t the operation 
160f0 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74  is an IN.** (not
16100 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
16110 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68  STS) and that th
16120 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74  e RHS might cont
16130 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41  ains NULLs..** A
16140 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
16150 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69  does is initiali
16160 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ze the register 
16170 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76  given by rMayHav
16180 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c  eNull.** to NULL
16190 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69  .  Calling routi
161a0 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61  nes will take ca
161b0 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74  re of changing t
161c0 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  his register.** 
161d0 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c  value to non-NUL
161e0 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  L if the RHS is 
161f0 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a  NULL-free..**.**
16200 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72   For a SELECT or
16210 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
16220 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67  , return the reg
16230 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
16240 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20   the.** result. 
16250 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c   For a multi-col
16260 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65 20  umn SELECT, the 
16270 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
16280 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73   in a contiguous
16290 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67  .** array of reg
162a0 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 72  isters and the r
162b0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
162c0 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  he register of t
162d0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20  he left-most.** 
162e0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20  result column.  
162f0 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e 20  Return 0 for IN 
16300 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20  operators or if 
16310 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
16320 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
16330 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
16340 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
16350 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72  Subselect(.  Par
16360 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
16370 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
16380 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
16390 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
163a0 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20       /* The IN, 
163b0 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54  SELECT, or EXIST
163c0 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  S operator */.  
163d0 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  int rHasNullFlag
163e0 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ,       /* Regis
163f0 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73  ter that records
16400 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65   whether NULLs e
16410 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20  xist in RHS */. 
16420 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20   int isRowid    
16430 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
16440 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f  rue, LHS of IN o
16450 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77  perator is a row
16460 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  id */.){.  int j
16470 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
16480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16490 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
164a0 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
164b0 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
164c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
164e0 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67  Register storing
164f0 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20   resulting */.  
16500 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
16510 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
16520 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
16530 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
16540 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61  .  /* The evalua
16550 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45  tion of the IN/E
16560 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73  XISTS/SELECT mus
16570 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76  t be repeated ev
16580 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a  ery time it.  **
16590 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
165a0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
165b0 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
165c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
165d0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
165e0 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
165f0 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
16600 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
16610 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
16620 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
16630 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
16640 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
16650 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
16660 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
16670 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
16680 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
16690 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
166a0 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
166b0 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
166c0 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
166d0 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
166e0 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
166f0 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
16700 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
16710 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
16720 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
16730 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49  ect) ){.    jmpI
16740 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74  fDynamic = sqlit
16750 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
16760 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
16770 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
16780 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
16790 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
167a0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
167b0 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
167c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
167d0 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
167e0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
167f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ction */.      E
16800 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
16810 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68  pr->pLeft; /* th
16820 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
16830 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
16840 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
16850 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  nfo = 0;      /*
16860 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   Key information
16870 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56   */.      int nV
16880 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
16890 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
168a0 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f   vector pLeft */
168b0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 56  .      .      nV
168c0 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
168d0 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
168e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
168f0 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61   !isRowid || nVa
16900 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  l==1 );..      /
16910 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69  * Whether this i
16920 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43  s an 'x IN(SELEC
16930 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20  T...)' or an 'x 
16940 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a  IN(<exprlist>)'.
16950 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
16960 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65  ion it is handle
16970 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20  d the same way. 
16980 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   An ephemeral ta
16990 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  ble is .      **
169a0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e 64   filled with ind
169b0 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e  ex keys represen
169c0 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
169d0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
169e0 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74 68   ** SELECT or th
169f0 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
16a00 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
16a10 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
16a20 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
16a30 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
16a40 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
16a50 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
16a60 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
16a70 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
16a80 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
16a90 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
16aa0 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
16ab0 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
16ac0 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
16ad0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
16ae0 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
16af0 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
16b00 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
16b10 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
16b20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
16b30 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
16b40 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
16b50 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
16b60 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
16b70 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
16b80 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
16b90 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
16ba0 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
16bb0 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
16bc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
16bd0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
16be0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
16bf0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
16c00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16c10 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
16c20 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 45  l, .          pE
16c30 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73  xpr->iTable, (is
16c40 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a  Rowid?0:nVal));.
16c50 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
16c60 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73   isRowid ? 0 : s
16c70 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
16c80 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
16c90 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  Val, 1);..      
16ca0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
16cb0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
16cc0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
16cd0 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
16ce0 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
16cf0 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
16d00 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
16d10 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
16d20 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
16d30 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
16d40 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
16d50 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
16d60 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
16d70 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
16d80 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16d90 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
16da0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  t = pExpr->x.pSe
16db0 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 45 78  lect;.        Ex
16dc0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
16dd0 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
16de0 3b 0a 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61  ;..        Expla
16df0 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
16e00 72 73 65 2c 20 31 2c 20 22 25 73 4c 49 53 54 20  rse, 1, "%sLIST 
16e10 53 55 42 51 55 45 52 59 22 2c 0a 20 20 20 20 20  SUBQUERY",.     
16e20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
16e30 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45  mic>=0?"":"CORRE
16e40 4c 41 54 45 44 20 22 0a 20 20 20 20 20 20 20 20  LATED ".        
16e50 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
16e60 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
16e70 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
16e80 65 20 4c 48 53 20 61 6e 64 20 52 48 53 20 6f 66  e LHS and RHS of
16e90 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
16ea0 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74   do not match, t
16eb0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  hat.        ** e
16ec0 72 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62  rror will have b
16ed0 65 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20  een caught long 
16ee0 62 65 66 6f 72 65 20 77 65 20 72 65 61 63 68 20  before we reach 
16ef0 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20  this point. */. 
16f00 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59         if( ALWAY
16f10 53 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  S(pEList->nExpr=
16f20 3d 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  =nVal) ){.      
16f30 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
16f40 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  est;.          i
16f50 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
16f60 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
16f70 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
16f80 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
16f90 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ble);.          
16fa0 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20  dest.zAffSdst = 
16fb0 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70  exprINAffinity(p
16fc0 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
16fd0 20 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74           pSelect
16fe0 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
16ff0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17000 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ( pSelect->selFl
17010 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
17020 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  t );.          t
17030 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66  estcase( pKeyInf
17040 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65  o==0 ); /* Cause
17050 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69  d by OOM in sqli
17060 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
17070 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  ) */.          i
17080 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
17090 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
170a0 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
170b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
170c0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
170d0 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29  , dest.zAffSdst)
170e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
170f0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
17100 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  f(pKeyInfo);.   
17110 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17120 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
17130 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17140 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
17150 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74  b, dest.zAffSdst
17160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
17170 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ert( pKeyInfo!=0
17180 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20   ); /* OOM will 
17190 63 61 75 73 65 20 65 78 69 74 20 61 66 74 65 72  cause exit after
171a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
171b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
171c0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
171d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
171e0 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
171f0 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  pr>0 );.        
17200 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17210 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
17220 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b  ble(pKeyInfo) );
17230 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
17240 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29  =0; i<nVal; i++)
17250 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
17260 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56  pr *p = sqlite3V
17270 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
17280 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
17290 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
172a0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  o->aColl[i] = sq
172b0 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
172c0 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20  reCollSeq(.     
172d0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
172e0 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  e, p, pEList->a[
172f0 69 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20  i].pExpr.       
17300 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
17310 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
17320 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
17330 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
17340 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
17350 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
17360 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
17370 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
17380 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65          ** For e
17390 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
173a0 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
173b0 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
173c0 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
173d0 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
173e0 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
173f0 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
17400 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
17410 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
17420 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
17430 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
17440 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
17450 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
17460 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
17470 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
17480 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
17490 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
174a0 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
174b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
174c0 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48  finity of the LH
174d0 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20  S of the IN */. 
174e0 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
174f0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
17500 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
17510 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  .pList;.        
17520 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
17530 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
17540 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c       int r1, r2,
17550 20 72 33 3b 0a 20 20 20 20 20 20 20 20 61 66 66   r3;.        aff
17560 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
17570 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
17580 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
17590 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
175a0 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
175b0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
175c0 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  B;.        }.   
175d0 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
175e0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  o ){.          a
175f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
17600 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
17610 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20  (pKeyInfo) );.  
17620 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
17630 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c  ->aColl[0] = sql
17640 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
17650 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17660 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Left);.        }
17670 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
17680 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
17690 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
176a0 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
176b0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
176c0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
176d0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
176e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
176f0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17700 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
17710 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
17720 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
17730 30 2c 20 72 32 2c 20 30 2c 20 22 22 2c 20 50 34  0, r2, 0, "", P4
17740 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
17750 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
17760 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
17770 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
17780 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
17790 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
177a0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
177b0 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
177c0 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
177d0 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
177e0 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
177f0 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
17800 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
17810 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
17820 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
17830 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
17840 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
17850 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
17860 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
17870 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
17880 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
17890 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
178a0 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
178b0 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
178c0 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
178d0 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
178e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
178f0 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
17900 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
17910 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
17920 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
17930 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
17940 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49  geToNoop(v, jmpI
17950 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20  fDynamic);.     
17960 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
17970 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mic = -1;.      
17980 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
17990 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
179a0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
179b0 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
179c0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
179d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
179e0 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65  sRowid && sqlite
179f0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
17a00 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20  E2, &iValToIns) 
17a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
17a20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17a30 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74  (v, OP_InsertInt
17a40 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
17a50 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b   r2, iValToIns);
17a60 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
17a70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33  {.            r3
17a80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17a90 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
17aa0 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
17ab0 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
17ac0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
17ad0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17ae0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
17af0 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20  BeInt, r3,.     
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17b20 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17b30 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
17b40 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
17b50 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17b70 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
17b80 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
17b90 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20  ble, r2, r3);.  
17ba0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
17bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
17bc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17bd0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
17be0 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
17bf0 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
17c00 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17c10 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
17c20 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
17c30 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
17c40 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20  r2, r3, 1);.    
17c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17c60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
17c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
17c80 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17c90 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
17ca0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17cb0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17cc0 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
17cd0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
17ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17cf0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
17d00 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
17d10 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
17d20 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
17d30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17d40 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
17d50 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
17d60 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
17d70 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
17d80 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 20 20 28   /* Case 3:    (
17d90 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
17da0 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  ...).      **   
17db0 20 20 6f 72 3a 20 20 20 20 45 58 49 53 54 53 28    or:    EXISTS(
17dc0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
17dd0 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ...).      **.  
17de0 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c      ** For a SEL
17df0 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  ECT, generate co
17e00 64 65 20 74 6f 20 70 75 74 20 74 68 65 20 76 61  de to put the va
17e10 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  lues for all col
17e20 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a  umns of.      **
17e30 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 69   the first row i
17e40 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
17e50 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 72 65  registers and re
17e60 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
17e70 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66  f.      ** the f
17e80 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20  irst register.. 
17e90 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17ea0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
17eb0 58 49 53 54 53 2c 20 77 72 69 74 65 20 61 6e 20  XISTS, write an 
17ec0 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
17ed0 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
17ee0 73 74 73 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e  sts).      ** in
17ef0 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  to a register an
17f00 64 20 72 65 74 75 72 6e 20 74 68 61 74 20 72 65  d return that re
17f10 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20  gister number.. 
17f20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17f30 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20   In both cases, 
17f40 74 68 65 20 71 75 65 72 79 20 69 73 20 61 75 67  the query is aug
17f50 6d 65 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d  mented with "LIM
17f60 49 54 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 20  IT 1".  Any .   
17f70 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e     ** preexistin
17f80 67 20 6c 69 6d 69 74 20 69 73 20 64 69 73 63 61  g limit is disca
17f90 72 64 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  rded in place of
17fa0 20 74 68 65 20 6e 65 77 20 4c 49 4d 49 54 20 31   the new LIMIT 1
17fb0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17fc0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fe0 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
17ff0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e   statement to en
18000 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65  code */.      Se
18010 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18030 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65      /* How to de
18040 61 6c 20 77 69 74 68 20 53 45 4c 45 43 54 20 72  al with SELECT r
18050 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69  esult */.      i
18060 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18080 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
18090 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
180a0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
180b0 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
180d0 4e 65 77 20 6c 69 6d 69 74 20 65 78 70 72 65 73  New limit expres
180e0 73 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 74  sion */..      t
180f0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
18100 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
18110 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18120 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
18130 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61  ELECT );.      a
18140 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
18150 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70  ==TK_EXISTS || p
18160 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
18170 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ECT );.      ass
18180 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
18190 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
181a0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20  IsSelect) );..  
181b0 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72      pSel = pExpr
181c0 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
181d0 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
181e0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
181f0 22 25 73 53 43 41 4c 41 52 20 53 55 42 51 55 45  "%sSCALAR SUBQUE
18200 52 59 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RY",.           
18210 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
18220 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20  ?"":"CORRELATED 
18230 22 29 29 3b 0a 20 20 20 20 20 20 6e 52 65 67 20  "));.      nReg 
18240 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  = pExpr->op==TK_
18250 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70  SELECT ? pSel->p
18260 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31  EList->nExpr : 1
18270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
18280 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
18290 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  est, 0, pParse->
182a0 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70  nMem+1);.      p
182b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
182c0 52 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Reg;.      if( p
182d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
182e0 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ECT ){.        d
182f0 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
18300 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73  Mem;.        des
18310 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69  t.iSdst = dest.i
18320 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20  SDParm;.        
18330 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65  dest.nSdst = nRe
18340 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  g;.        sqlit
18350 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
18360 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74  OP_Null, 0, dest
18370 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e 69  .iSDParm, dest.i
18380 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a  SDParm+nReg-1);.
18390 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
183a0 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75  ent((v, "Init su
183b0 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
183c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
183d0 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73         dest.eDes
183e0 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a  t = SRT_Exists;.
183f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18400 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18410 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74  Integer, 0, dest
18420 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  .iSDParm);.     
18430 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
18440 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20  v, "Init EXISTS 
18450 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
18460 20 7d 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20   }.      pLimit 
18470 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
18480 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54  oc(pParse->db, T
18490 4b 5f 49 4e 54 45 47 45 52 2c 26 73 71 6c 69 74  K_INTEGER,&sqlit
184a0 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20  e3IntTokens[1], 
184b0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
184c0 65 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  el->pLimit ){.  
184d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
184e0 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
184f0 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
18500 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
18510 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e    pSel->pLimit->
18520 70 4c 65 66 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  pLeft = pLimit;.
18530 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18540 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
18550 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
18560 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 49 4d 49  (pParse, TK_LIMI
18570 54 2c 20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20  T, pLimit, 0);. 
18580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65       }.      pSe
18590 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  l->iLimit = 0;. 
185a0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
185b0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
185c0 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  Sel, &dest) ){. 
185d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
185e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
185f0 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Reg = dest.iSDPa
18600 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65  rm;.      ExprSe
18610 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
18620 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
18630 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18640 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
18650 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a  rHasNullFlag ){.
18660 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61      sqlite3SetHa
18670 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78  sNullFlag(v, pEx
18680 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73  pr->iTable, rHas
18690 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a  NullFlag);.  }..
186a0 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d    if( jmpIfDynam
186b0 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ic>=0 ){.    sql
186c0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
186d0 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  (v, jmpIfDynamic
186e0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
186f0 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20   rReg;.}.#endif 
18700 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
18710 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
18720 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18730 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45  SUBQUERY./*.** E
18740 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49 4e  xpr pIn is an IN
18750 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
18760 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
18770 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
18780 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  .** sub-select o
18790 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
187a0 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20 68   IN() operator h
187b0 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  as the same numb
187c0 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e  er of .** column
187d0 73 20 61 73 20 74 68 65 20 76 65 63 74 6f 72 20  s as the vector 
187e0 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20  on the LHS. Or, 
187f0 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  if the RHS of th
18800 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a  e IN() is not .*
18810 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20 74  * a sub-query, t
18820 68 61 74 20 74 68 65 20 4c 48 53 20 69 73 20 61  hat the LHS is a
18830 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65 20   vector of size 
18840 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
18850 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61 72  3ExprCheckIN(Par
18860 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
18870 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56   *pIn){.  int nV
18880 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45  ector = sqlite3E
18890 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 49  xprVectorSize(pI
188a0 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  n->pLeft);.  if(
188b0 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45   (pIn->flags & E
188c0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
188d0 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 21      if( nVector!
188e0 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  =pIn->x.pSelect-
188f0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
18900 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
18910 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
18920 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65  arse, pIn->x.pSe
18930 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
18940 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  xpr, nVector);. 
18950 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
18960 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
18970 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20   nVector!=1 ){. 
18980 20 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72     sqlite3Vector
18990 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
189a0 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20   pIn->pLeft);.  
189b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
189c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
189d0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
189e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
189f0 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
18a00 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e  e code for an IN
18a10 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
18a20 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  **      x IN (SE
18a30 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20  LECT ...).**    
18a40 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76    x IN (value, v
18a50 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  alue, ...).**.**
18a60 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   The left-hand s
18a70 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73  ide (LHS) is a s
18a80 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f 72 20  calar or vector 
18a90 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
18aa0 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20   .** right-hand 
18ab0 73 69 64 65 20 28 52 48 53 29 20 69 73 20 61 6e  side (RHS) is an
18ac0 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f   array of zero o
18ad0 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20 76 61  r more scalar va
18ae0 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75  lues, or a.** su
18af0 62 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20  bquery.  If the 
18b00 52 48 53 20 69 73 20 61 20 73 75 62 71 75 65 72  RHS is a subquer
18b10 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
18b20 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
18b30 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68  must.** match th
18b40 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
18b50 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f  mns in the vecto
18b60 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20 49  r on the LHS.  I
18b70 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a 2a 20  f the RHS is.** 
18b80 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
18b90 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62  , the LHS must b
18ba0 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a  e a scalar. .**.
18bb0 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  ** The IN operat
18bc0 6f 72 20 69 73 20 74 72 75 65 20 69 66 20 74 68  or is true if th
18bd0 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73 20 63  e LHS value is c
18be0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
18bf0 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20  the RHS..** The 
18c00 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20  result is false 
18c10 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 64 65  if the LHS is de
18c20 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20  finitely not in 
18c30 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 0a 2a  the RHS.  The .*
18c40 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  * result is NULL
18c50 20 69 66 20 74 68 65 20 70 72 65 73 65 6e 63 65   if the presence
18c60 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 74   of the LHS in t
18c70 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20 62 65  he RHS cannot be
18c80 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
18c90 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a  due to NULLs..**
18ca0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18cb0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
18cc0 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65  that jumps to de
18cd0 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65  stIfFalse if the
18ce0 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20   LHS is not .** 
18cf0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
18d00 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75   the RHS.  If du
18d10 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61  e to NULLs we ca
18d20 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69  nnot determine i
18d30 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20  f the LHS.** is 
18d40 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
18d50 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74   RHS then jump t
18d60 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
18d70 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
18d80 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  tained.** within
18d90 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61   the RHS then fa
18da0 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a  ll through..**.*
18db0 2a 20 53 65 65 20 74 68 65 20 73 65 70 61 72 61  * See the separa
18dc0 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d  te in-operator.m
18dd0 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  d documentation 
18de0 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61 6e 6f  file in the cano
18df0 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20  nical.** SQLite 
18e00 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f 72 20  source tree for 
18e10 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
18e20 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
18e30 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
18e40 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73  prCodeIN(.  Pars
18e50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
18e60 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
18e70 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
18e80 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
18e90 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
18ea0 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78      /* The IN ex
18eb0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
18ec0 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20  t destIfFalse,  
18ed0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
18ee0 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63   if LHS is not c
18ef0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
18f00 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  RHS */.  int des
18f10 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f  tIfNull        /
18f20 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
18f30 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75  he results are u
18f40 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55  nknown due to NU
18f50 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  LLs */.){.  int 
18f60 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
18f70 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
18f80 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48  at is true if RH
18f90 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  S contains NULL 
18fa0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
18fb0 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  eType;          
18fc0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65    /* Type of the
18fd0 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c   RHS */.  int rL
18fe0 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
18ff0 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29 20 68  /* Register(s) h
19000 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53 20 76  olding the LHS v
19010 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  alues */.  int r
19020 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20 20 20  LhsOrig;        
19030 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73 20 70   /* LHS values p
19040 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65 72 69  rior to reorderi
19050 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f  ng by aiMap[] */
19060 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
19070 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
19080 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
19090 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
190a0 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20  t *aiMap = 0;   
190b0 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20      /* Map from 
190c0 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20  vector field to 
190d0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  index column */.
190e0 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30    char *zAff = 0
190f0 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e  ;       /* Affin
19100 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63  ity string for c
19110 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20  omparisons */.  
19120 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20  int nVector;    
19130 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19140 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69   vectors for thi
19150 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  s IN operator */
19160 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20  .  int iDummy;  
19170 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d           /* Dumm
19180 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 65  y parameter to e
19190 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 29 20  xprCodeVector() 
191a0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
191b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
191c0 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
191d0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
191e0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
191f0 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e      /* loop coun
19200 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ter */.  int des
19210 74 53 74 65 70 32 3b 20 20 20 20 20 20 20 20 2f  tStep2;        /
19220 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
19230 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20  when NULLs seen 
19240 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20 20 69  in step 2 */.  i
19250 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d 20 30  nt destStep6 = 0
19260 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ;    /* Start of
19270 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70 20 36   code for Step 6
19280 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 72   */.  int addrTr
19290 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41  uthOp;      /* A
192a0 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f 64 65  ddress of opcode
192b0 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
192c0 20 74 68 65 20 49 4e 20 69 73 20 74 72 75 65 20   the IN is true 
192d0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f 74  */.  int destNot
192e0 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75  Null;      /* Ju
192f0 6d 70 20 68 65 72 65 20 69 66 20 61 20 63 6f 6d  mp here if a com
19300 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74  parison is not t
19310 72 75 65 20 69 6e 20 73 74 65 70 20 36 20 2a 2f  rue in step 6 */
19320 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
19330 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
19340 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20 6c 6f  of the step-6 lo
19350 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66 74 20  op */ ..  pLeft 
19360 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
19370 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
19380 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c  rCheckIN(pParse,
19390 20 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e   pExpr) ) return
193a0 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49  ;.  zAff = exprI
193b0 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  NAffinity(pParse
193c0 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56 65 63  , pExpr);.  nVec
193d0 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tor = sqlite3Exp
193e0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
193f0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d  r->pLeft);.  aiM
19400 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ap = (int*)sqlit
19410 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  e3DbMallocZero(.
19420 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
19430 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f  , nVector*(sizeo
19440 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28  f(int) + sizeof(
19450 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a  char)) + 1.  );.
19460 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
19470 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19480 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
19490 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f  rCodeIN_oom_erro
194a0 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74  r;..  /* Attempt
194b0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
194c0 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73 20  RHS. After this 
194d0 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e  step, if anythin
194e0 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a  g other than.  *
194f0 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  * IN_INDEX_NOOP 
19500 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
19510 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69 74   table opened it
19520 68 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d 3e  h cursor pExpr->
19530 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e  iTable .  ** con
19540 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
19550 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
19560 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44  e RHS. If IN_IND
19570 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72  EX_NOOP is retur
19580 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48  ned,.  ** the RH
19590 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  S has not yet be
195a0 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20  en coded.  */.  
195b0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
195c0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
195d0 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f  0 );       /* OO
195e0 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72  M detected prior
195f0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
19600 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
19610 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
19620 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65   IN expr"));.  e
19630 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
19640 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
19650 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20  , pExpr,.       
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d        IN_INDEX_M
19680 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49  EMBERSHIP | IN_I
19690 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20  NDEX_NOOP_OK,.  
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196b0 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74 49             destI
196c0 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
196d0 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61  ll ? 0 : &rRhsHa
196e0 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a  sNull, aiMap);..
196f0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
19700 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f  ->nErr || nVecto
19710 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49  r==1 || eType==I
19720 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20  N_INDEX_EPH.    
19730 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f     || eType==IN_
19740 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
19750 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  || eType==IN_IND
19760 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20  EX_INDEX_DESC . 
19770 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
19780 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e  E_DEBUG.  /* Con
19790 66 69 72 6d 20 74 68 61 74 20 61 69 4d 61 70 5b  firm that aiMap[
197a0 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74  ] contains nVect
197b0 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  or integer value
197c0 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 0a  s between 0 and.
197d0 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20    ** nVector-1. 
197e0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
197f0 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
19800 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20     int j, cnt;. 
19810 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20     for(cnt=j=0; 
19820 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20  j<nVector; j++) 
19830 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20  if( aiMap[j]==i 
19840 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73  ) cnt++;.    ass
19850 65 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20  ert( cnt==1 );. 
19860 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
19870 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68  Code the LHS, th
19880 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c  e <expr> from "<
19890 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e  expr> IN (...)".
198a0 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 61   If the LHS is a
198b0 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74   .  ** vector, t
198c0 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64  hen it is stored
198d0 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
198e0 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74 65 72  nVector register
198f0 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a  s starting .  **
19900 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a   at r1..  **.  *
19910 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  * sqlite3FindInI
19920 6e 64 65 78 28 29 20 6d 69 67 68 74 20 68 61 76  ndex() might hav
19930 65 20 72 65 6f 72 64 65 72 65 64 20 74 68 65 20  e reordered the 
19940 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4c 48  fields of the LH
19950 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f  S vector.  ** so
19960 20 74 68 61 74 20 74 68 65 20 66 69 65 6c 64 73   that the fields
19970 20 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65   are in the same
19980 20 6f 72 64 65 72 20 61 73 20 61 6e 20 65 78 69   order as an exi
19990 73 74 69 6e 67 20 69 6e 64 65 78 2e 20 20 20 54  sting index.   T
199a0 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20  he.  ** aiMap[] 
199b0 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61  array contains a
199c0 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68   mapping from th
199d0 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20 66  e original LHS f
199e0 69 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20 20  ield order to.  
199f0 2a 2a 20 74 68 65 20 66 69 65 6c 64 20 6f 72 64  ** the field ord
19a00 65 72 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  er that matches 
19a10 74 68 65 20 52 48 53 20 69 6e 64 65 78 2e 0a 20  the RHS index.. 
19a20 20 2a 2f 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d   */.  rLhsOrig =
19a30 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
19a40 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
19a50 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69  iDummy);.  for(i
19a60 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26 26  =0; i<nVector &&
19a70 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b   aiMap[i]==i; i+
19a80 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20  +){} /* Are LHS 
19a90 66 69 65 6c 64 73 20 72 65 6f 72 64 65 72 65 64  fields reordered
19aa0 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56  ? */.  if( i==nV
19ab0 65 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20  ector ){.    /* 
19ac0 4c 48 53 20 66 69 65 6c 64 73 20 61 72 65 20 6e  LHS fields are n
19ad0 6f 74 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a  ot reordered */.
19ae0 20 20 20 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f      rLhs = rLhsO
19af0 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rig;.  }else{.  
19b00 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f    /* Need to reo
19b10 72 64 65 72 20 74 68 65 20 4c 48 53 20 66 69 65  rder the LHS fie
19b20 6c 64 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  lds according to
19b30 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c   aiMap */.    rL
19b40 68 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  hs = sqlite3GetT
19b50 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
19b60 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 66   nVector);.    f
19b70 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
19b80 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
19b90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19ba0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68  (v, OP_Copy, rLh
19bb0 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69  sOrig+i, rLhs+ai
19bc0 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20  Map[i], 0);.    
19bd0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
19be0 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
19bf0 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64  x() did not find
19c00 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e   or create an in
19c10 64 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  dex that is.  **
19c20 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76   suitable for ev
19c30 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20  aluating the IN 
19c40 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65  operator, then e
19c50 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a  valuate using a.
19c60 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66    ** sequence of
19c70 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20   comparisons..  
19c80 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
19c90 73 74 65 70 20 28 31 29 20 69 6e 20 74 68 65 20  step (1) in the 
19ca0 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f  in-operator.md o
19cb0 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74  ptimized algorit
19cc0 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  hm..  */.  if( e
19cd0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e  Type==IN_INDEX_N
19ce0 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  OOP ){.    ExprL
19cf0 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
19d00 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
19d10 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
19d20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
19d30 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
19d40 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
19d50 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71  int labelOk = sq
19d60 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19d70 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72  el(v);.    int r
19d80 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20  2, regToFree;.  
19d90 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20    int regCkNull 
19da0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b  = 0;.    int ii;
19db0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
19dc0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
19dd0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
19de0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65  t) );.    if( de
19df0 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66  stIfNull!=destIf
19e00 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72  False ){.      r
19e10 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  egCkNull = sqlit
19e20 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
19e30 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
19e40 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19e50 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73   OP_BitAnd, rLhs
19e60 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c  , rLhs, regCkNul
19e70 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  l);.    }.    fo
19e80 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74  r(ii=0; ii<pList
19e90 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
19ea0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
19eb0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
19ec0 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
19ed0 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54  ii].pExpr, &regT
19ee0 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66  oFree);.      if
19ef0 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73  ( regCkNull && s
19f00 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
19f10 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  ull(pList->a[ii]
19f20 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
19f30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19f40 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e  dOp3(v, OP_BitAn
19f50 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32  d, regCkNull, r2
19f60 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
19f70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19f80 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  ii<pList->nExpr-
19f90 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21  1 || destIfNull!
19fa0 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
19fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19fc0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
19fd0 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f  Eq, rLhs, labelO
19fe0 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  k, r2,.         
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a000 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
1a010 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
1a020 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a030 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e  If(v, ii<pList->
1a040 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20  nExpr-1);.      
1a050 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1a060 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e  (v, ii==pList->n
1a070 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20  Expr-1);.       
1a080 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1a090 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29  geP5(v, zAff[0])
1a0a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a0b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
1a0c0 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49  estIfNull==destI
1a0d0 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20  fFalse );.      
1a0e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a0f0 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c  Op4(v, OP_Ne, rL
1a100 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  hs, destIfFalse,
1a110 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a130 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
1a140 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f  COLLSEQ); VdbeCo
1a150 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1a160 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1a170 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30  angeP5(v, zAff[0
1a180 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ] | SQLITE_JUMPI
1a190 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
1a1a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1a1b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a1c0 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a  se, regToFree);.
1a1d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
1a1e0 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  gCkNull ){.     
1a1f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a200 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
1a210 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74   regCkNull, dest
1a220 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76  IfNull); VdbeCov
1a230 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1a240 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1a250 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
1a260 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1a270 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1a280 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a  el(v, labelOk);.
1a290 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1a2a0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1a2b0 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
1a2c0 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78    goto sqlite3Ex
1a2d0 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65  prCodeIN_finishe
1a2e0 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  d;.  }..  /* Ste
1a2f0 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20 73 65  p 2: Check to se
1a300 65 20 69 66 20 74 68 65 20 4c 48 53 20 63 6f 6e  e if the LHS con
1a310 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63  tains any NULL c
1a320 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a  olumns.  If the.
1a330 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f    ** LHS does co
1a340 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e  ntain NULLs then
1a350 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   the result must
1a360 20 62 65 20 65 69 74 68 65 72 20 46 41 4c 53 45   be either FALSE
1a370 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57   or NULL..  ** W
1a380 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70  e will then skip
1a390 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72   the binary sear
1a3a0 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20  ch of the RHS.. 
1a3b0 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66   */.  if( destIf
1a3c0 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
1a3d0 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53 74 65  e ){.    destSte
1a3e0 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65  p2 = destIfFalse
1a3f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1a400 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 53  estStep2 = destS
1a410 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64  tep6 = sqlite3Vd
1a420 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1a430 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1a440 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
1a450 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
1a460 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
1a470 53 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70  Subexpr(pExpr->p
1a480 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 69 66  Left, i);.    if
1a490 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
1a4a0 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20  BeNull(p) ){.   
1a4b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a4c0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
1a4d0 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 53  l, rLhs+i, destS
1a4e0 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56 64 62  tep2);.      Vdb
1a4f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a500 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74    }.  }..  /* St
1a510 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53 20 69  ep 3.  The LHS i
1a520 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62  s now known to b
1a530 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20  e non-NULL.  Do 
1a540 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
1a550 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48  h.  ** of the RH
1a560 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48 53 20  S using the LHS 
1a570 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49 66 20  as a probe.  If 
1a580 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73 75 6c  found, the resul
1a590 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a  t is.  ** true..
1a5a0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1a5b0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
1a5c0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
1a5d0 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53  is case, the RHS
1a5e0 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66   is the ROWID of
1a5f0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e   table b-tree an
1a600 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20  d so we also.   
1a610 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   ** know that th
1a620 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c  e RHS is non-NUL
1a630 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 63 6f  L.  Hence, we co
1a640 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20 61 6e  mbine steps 3 an
1a650 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  d 4.    ** into 
1a660 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
1a670 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
1a680 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1a690 53 65 65 6b 52 6f 77 69 64 2c 20 70 45 78 70 72  SeekRowid, pExpr
1a6a0 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
1a6b0 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20  False, rLhs);.  
1a6c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1a6d0 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74 68  );.    addrTruth
1a6e0 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
1a6f0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
1a700 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54  o);  /* Return T
1a710 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  rue */.  }else{.
1a720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a730 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
1a740 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63  nity, rLhs, nVec
1a750 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56  tor, 0, zAff, nV
1a760 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ector);.    if( 
1a770 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
1a780 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  tIfNull ){.     
1a790 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70   /* Combine Step
1a7a0 20 33 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e   3 and Step 5 in
1a7b0 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  to a single opco
1a7c0 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  de */.      sqli
1a7d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1a7e0 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
1a7f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
1a800 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20 20 20  destIfFalse,.   
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56          rLhs, nV
1a830 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65  ector); VdbeCove
1a840 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 67  rage(v);.      g
1a850 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
1a860 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a  odeIN_finished;.
1a870 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64      }.    /* Ord
1a880 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20 66 6f  inary Step 3, fo
1a890 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  r the case where
1a8a0 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20   FALSE and NULL 
1a8b0 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  are distinct */.
1a8c0 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20      addrTruthOp 
1a8d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a8e0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
1a8f0 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
1a900 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  e, 0,.          
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a920 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73              rLhs
1a930 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65  , nVector); Vdbe
1a940 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
1a950 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20  ..  /* Step 4.  
1a960 49 66 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e  If the RHS is kn
1a970 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55  own to be non-NU
1a980 4c 4c 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f  LL and we did no
1a990 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d  t find.  ** an m
1a9a0 61 74 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72  atch on the sear
1a9b0 63 68 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74  ch above, then t
1a9c0 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62  he result must b
1a9d0 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20  e FALSE..  */.  
1a9e0 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  if( rRhsHasNull 
1a9f0 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b  && nVector==1 ){
1aa00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1aa10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
1aa20 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c  Null, rRhsHasNul
1aa30 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  l, destIfFalse);
1aa40 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1aa50 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(v);.  }..  /* 
1aa60 53 74 65 70 20 35 2e 20 20 49 66 20 77 65 20 64  Step 5.  If we d
1aa70 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
1aa80 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
1aa90 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64  between NULL and
1aaa0 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65  .  ** FALSE, the
1aab0 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61  n just return fa
1aac0 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  lse. .  */.  if(
1aad0 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
1aae0 73 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74  stIfNull ) sqlit
1aaf0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
1ab00 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f  stIfFalse);..  /
1ab10 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74  * Step 6: Loop t
1ab20 68 72 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74  hrough rows of t
1ab30 68 65 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65  he RHS.  Compare
1ab40 20 65 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65   each row to the
1ab50 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e   LHS..  ** If an
1ab60 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  y comparison is 
1ab70 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72  NULL, then the r
1ab80 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20  esult is NULL.  
1ab90 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70  If all.  ** comp
1aba0 61 72 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53  arisons are FALS
1abb0 45 20 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c  E then the final
1abc0 20 72 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45   result is FALSE
1abd0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  ..  **.  ** For 
1abe0 61 20 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74  a scalar LHS, it
1abf0 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74   is sufficient t
1ac00 6f 20 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65  o check just the
1ac10 20 66 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20   first row.  ** 
1ac20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f  of the RHS..  */
1ac30 0a 20 20 69 66 28 20 64 65 73 74 53 74 65 70 36  .  if( destStep6
1ac40 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   ) sqlite3VdbeRe
1ac50 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1ac60 73 74 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72  stStep6);.  addr
1ac70 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
1ac80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
1ac90 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  wind, pExpr->iTa
1aca0 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
1acb0 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
1acc0 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56 65 63  e(v);.  if( nVec
1acd0 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64 65 73  tor>1 ){.    des
1ace0 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  tNotNull = sqlit
1acf0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1ad00 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
1ad10 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72 3d   /* For nVector=
1ad20 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65 70  =1, combine step
1ad30 73 20 36 20 61 6e 64 20 37 20 62 79 20 69 6d 6d  s 6 and 7 by imm
1ad40 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 69  ediately returni
1ad50 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45 20  ng.    ** FALSE 
1ad60 69 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d  if the first com
1ad70 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 4e  parison is not N
1ad80 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74 4e  ULL */.    destN
1ad90 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66 46  otNull = destIfF
1ada0 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  alse;.  }.  for(
1adb0 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
1adc0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
1add0 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  p;.    CollSeq *
1ade0 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72  pColl;.    int r
1adf0 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  3 = sqlite3GetTe
1ae00 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1ae10 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 56 65     p = sqlite3Ve
1ae20 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
1ae30 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  (pLeft, i);.    
1ae40 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1ae50 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1ae60 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, p);.    sqlit
1ae70 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1ae80 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72  OP_Column, pExpr
1ae90 2d 3e 69 54 61 62 6c 65 2c 20 69 2c 20 72 33 29  ->iTable, i, r3)
1aea0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1aeb0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
1aec0 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f  , rLhs+i, destNo
1aed0 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20  tNull, r3,.     
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aef0 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
1af00 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
1af10 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1af20 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1af30 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1af40 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71  e, r3);.  }.  sq
1af50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1af60 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
1af70 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66  estIfNull);.  if
1af80 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20  ( nVector>1 ){. 
1af90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1afa0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1afb0 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20  stNotNull);.    
1afc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1afd0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 45  2(v, OP_Next, pE
1afe0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64  xpr->iTable, add
1aff0 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64 62  rTop+1);.    Vdb
1b000 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1b010 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20 20 49     /* Step 7:  I
1b020 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
1b030 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
1b040 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hat the result m
1b050 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 66 61  ust.    ** be fa
1b060 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  lse. */.    sqli
1b070 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b080 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
1b090 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a  tIfFalse);.  }..
1b0a0 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65 20    /* Jumps here 
1b0b0 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 74 75  in order to retu
1b0c0 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71  rn true. */.  sq
1b0d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1b0e0 65 28 76 2c 20 61 64 64 72 54 72 75 74 68 4f 70  e(v, addrTruthOp
1b0f0 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70 72 43  );..sqlite3ExprC
1b100 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a  odeIN_finished:.
1b110 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c 68 73    if( rLhs!=rLhs
1b120 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33 52 65  Orig ) sqlite3Re
1b130 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1b140 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 56 64  rse, rLhs);.  Vd
1b150 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
1b160 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 73  nd IN expr"));.s
1b170 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
1b180 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71  _oom_error:.  sq
1b190 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1b1a0 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a  se->db, aiMap);.
1b1b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1b1c0 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66  pParse->db, zAff
1b1d0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
1b1e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1b1f0 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
1b200 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1b210 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a  TING_POINT./*.**
1b220 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
1b230 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
1b240 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74  ll put the float
1b250 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
1b260 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ue described by 
1b270 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
1b280 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
1b290 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
1b2a0 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
1b2b0 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
1b2c0 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
1b2d0 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
1b2e0 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
1b2f0 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
1b300 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
1b310 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
1b320 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
1b330 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
1b340 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
1b350 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63  eReal(Vdbe *v, c
1b360 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
1b370 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e  t negateFlag, in
1b380 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41  t iMem){.  if( A
1b390 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20  LWAYS(z!=0) ){. 
1b3a0 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b     double value;
1b3b0 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
1b3c0 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69  (z, &value, sqli
1b3d0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20  te3Strlen30(z), 
1b3e0 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
1b3f0 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
1b400 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29  e3IsNaN(value) )
1b410 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f  ; /* The new Ato
1b420 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20  F never returns 
1b430 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  NaN */.    if( n
1b440 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75  egateFlag ) valu
1b450 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20  e = -value;.    
1b460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b470 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c  4Dup8(v, OP_Real
1b480 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75  , 0, iMem, 0, (u
1b490 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45  8*)&value, P4_RE
1b4a0 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  AL);.  }.}.#endi
1b4b0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  f.../*.** Genera
1b4c0 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
1b4d0 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
1b4e0 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
1b4f0 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
1b500 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
1b510 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
1b520 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  .** Expr.u.zToke
1b530 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38  n is always UTF8
1b540 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e   and zero-termin
1b550 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
1b560 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72  void codeInteger
1b570 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b580 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1b590 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d   negFlag, int iM
1b5a0 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  em){.  Vdbe *v =
1b5b0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1b5c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
1b5d0 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
1b5e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
1b5f0 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b  pExpr->u.iValue;
1b600 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
1b610 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67  0 );.    if( neg
1b620 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20  Flag ) i = -i;. 
1b630 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b640 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1b650 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
1b660 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63  }else{.    int c
1b670 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b  ;.    i64 value;
1b680 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1b690 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  *z = pExpr->u.zT
1b6a0 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  oken;.    assert
1b6b0 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20  ( z!=0 );.    c 
1b6c0 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  = sqlite3DecOrHe
1b6d0 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65  xToI64(z, &value
1b6e0 29 3b 0a 20 20 20 20 69 66 28 20 28 63 3d 3d 33  );.    if( (c==3
1b6f0 20 26 26 20 21 6e 65 67 46 6c 61 67 29 20 7c 7c   && !negFlag) ||
1b700 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e 65 67 46   (c==2) || (negF
1b710 6c 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d  lag && value==SM
1b720 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a  ALLEST_INT64)){.
1b730 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
1b740 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1b750 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  T.      sqlite3E
1b760 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b770 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67  "oversized integ
1b780 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c  er: %s%s", negFl
1b790 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a  ag ? "-" : "", z
1b7a0 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66  );.#else.#ifndef
1b7b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58   SQLITE_OMIT_HEX
1b7c0 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69  _INTEGER.      i
1b7d0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
1b7e0 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30  cmp(z,"0x",2)==0
1b7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b800 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1b810 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c  se, "hex literal
1b820 20 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c   too big: %s%s",
1b830 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c   negFlag?"-":"",
1b840 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  z);.      }else.
1b850 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
1b860 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
1b870 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69  v, z, negFlag, i
1b880 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Mem);.      }.#e
1b890 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
1b8a0 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61        if( negFla
1b8b0 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d  g ){ value = c==
1b8c0 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  3 ? SMALLEST_INT
1b8d0 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20  64 : -value; }. 
1b8e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b8f0 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
1b900 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c  _Int64, 0, iMem,
1b910 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c   0, (u8*)&value,
1b920 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20   P4_INT64);.    
1b930 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e  }.  }.}.../* Gen
1b940 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1b950 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72  will load into r
1b960 65 67 69 73 74 65 72 20 72 65 67 4f 75 74 20 61  egister regOut a
1b970 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a   value that is.*
1b980 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  * appropriate fo
1b990 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68  r the iIdxCol-th
1b9a0 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
1b9b0 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73   pIdx..*/.void s
1b9c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f  qlite3ExprCodeLo
1b9d0 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20  adIndexColumn(. 
1b9e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1b9f0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1ba00 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
1ba10 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20  ex *pIdx,    /* 
1ba20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20  The index whose 
1ba30 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20  column is to be 
1ba40 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
1ba50 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43  iTabCur,    /* C
1ba60 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1ba70 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f  o a table row */
1ba80 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20  .  int iIdxCol, 
1ba90 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
1baa0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
1bab0 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20   be loaded */.  
1bac0 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
1bad0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64  /* Store the ind
1bae0 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  ex column value 
1baf0 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
1bb00 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61   */.){.  i16 iTa
1bb10 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  bCol = pIdx->aiC
1bb20 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a  olumn[iIdxCol];.
1bb30 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58    if( iTabCol==X
1bb40 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73  N_EXPR ){.    as
1bb50 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c  sert( pIdx->aCol
1bb60 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65  Expr );.    asse
1bb70 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  rt( pIdx->aColEx
1bb80 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f  pr->nExpr>iIdxCo
1bb90 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  l );.    pParse-
1bba0 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62  >iSelfTab = iTab
1bbb0 43 75 72 20 2b 20 31 3b 0a 20 20 20 20 73 71 6c  Cur + 1;.    sql
1bbc0 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
1bbd0 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61  (pParse, pIdx->a
1bbe0 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43  ColExpr->a[iIdxC
1bbf0 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f 75  ol].pExpr, regOu
1bc00 74 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  t);.    pParse->
1bc10 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20  iSelfTab = 0;.  
1bc20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1bc30 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1bc40 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73  umnOfTable(pPars
1bc50 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e  e->pVdbe, pIdx->
1bc60 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c  pTable, iTabCur,
1bc70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc90 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65       iTabCol, re
1bca0 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
1bcb0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1bcc0 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
1bcd0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43   value of the iC
1bce0 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
1bcf0 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
1bd00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bd10 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1bd20 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
1bd30 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
1bd40 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1bd50 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  on */.  Table *p
1bd60 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74  Tab,    /* The t
1bd70 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
1bd80 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  the value */.  i
1bd90 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f  nt iTabCur,    /
1bda0 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73  * The table curs
1bdb0 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63  or.  Or the PK c
1bdc0 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55  ursor for WITHOU
1bdd0 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74  T ROWID */.  int
1bde0 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20   iCol,       /* 
1bdf0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
1be00 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a  umn to extract *
1be10 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20  /.  int regOut  
1be20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
1be30 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  he value into th
1be40 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
1be50 7b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  {.  if( pTab==0 
1be60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1be70 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1be80 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c 20  olumn, iTabCur, 
1be90 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  iCol, regOut);. 
1bea0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1beb0 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69   if( iCol<0 || i
1bec0 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  Col==pTab->iPKey
1bed0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1bee0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1bef0 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20  Rowid, iTabCur, 
1bf00 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  regOut);.  }else
1bf10 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49  {.    int op = I
1bf20 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
1bf30 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50   OP_VColumn : OP
1bf40 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74  _Column;.    int
1bf50 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69   x = iCol;.    i
1bf60 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
1bf70 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  b) && !IsVirtual
1bf80 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
1bf90 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
1bfa0 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33  nOfIndex(sqlite3
1bfb0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1bfc0 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20  pTab), iCol);.  
1bfd0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1bfe0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1bff0 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67   iTabCur, x, reg
1c000 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Out);.  }.  if( 
1c010 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  iCol>=0 ){.    s
1c020 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
1c030 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
1c040 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
1c050 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1c060 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1c070 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
1c080 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
1c090 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
1c0a0 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
1c0b0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1c0c0 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 0a  register iReg. .
1c0d0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
1c0e0 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   be an open curs
1c0f0 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54  or to pTab in iT
1c100 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  able when this r
1c110 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
1c120 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e  led.  If iColumn
1c130 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20  <0 then code is 
1c140 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65  generated that e
1c150 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69  xtracts the rowi
1c160 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1c170 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1c180 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
1c190 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
1c1a0 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
1c1b0 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
1c1c0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
1c1d0 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
1c1e0 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  on of the table 
1c1f0 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66  we are reading f
1c200 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  rom */.  int iCo
1c210 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64  lumn,     /* Ind
1c220 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
1c230 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
1c240 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  iTable,      /* 
1c250 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  The cursor point
1c260 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ing to the table
1c270 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20   */.  int iReg, 
1c280 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
1c290 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
1c2a0 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20    u8 p5         
1c2b0 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66     /* P5 value f
1c2c0 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46  or OP_Column + F
1c2d0 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  LAGS */.){.  Vdb
1c2e0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1c2f0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
1c300 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
1c310 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1c320 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61  mnOfTable(v, pTa
1c330 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  b, iTable, iColu
1c340 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28  mn, iReg);.  if(
1c350 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   p5 ){.    sqlit
1c360 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1c370 2c 20 70 35 29 3b 0a 20 20 7d 0a 20 20 72 65 74  , p5);.  }.  ret
1c380 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
1c390 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1c3a0 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
1c3b0 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
1c3c0 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
1c3d0 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
1c3e0 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
1c3f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c400 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72  ExprCodeMove(Par
1c410 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1c420 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20  iFrom, int iTo, 
1c430 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73  int nReg){.  ass
1c440 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b  ert( iFrom>=iTo+
1c450 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52  nReg || iFrom+nR
1c460 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c  eg<=iTo );.  sql
1c470 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1c480 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1c490 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54  _Move, iFrom, iT
1c4a0 6f 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 2f 2a 0a  o, nReg);.}../*.
1c4b0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61  ** Convert a sca
1c4c0 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  lar expression n
1c4d0 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49  ode to a TK_REGI
1c4e0 53 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67  STER referencing
1c4f0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52 65  .** register iRe
1c500 67 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  g.  The caller m
1c510 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
1c520 69 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e  iReg already con
1c530 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72  tains.** the cor
1c540 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
1c550 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
1c560 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1c570 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70  prToRegister(Exp
1c580 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b  r *p, int iReg){
1c590 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f  .  p->op2 = p->o
1c5a0 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  p;.  p->op = TK_
1c5b0 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69  REGISTER;.  p->i
1c5c0 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20  Table = iReg;.  
1c5d0 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
1c5e0 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d  y(p, EP_Skip);.}
1c5f0 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65  ../*.** Evaluate
1c600 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28   an expression (
1c610 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20  either a vector 
1c620 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  or a scalar expr
1c630 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72  ession) and stor
1c640 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
1c650 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74  in continguous t
1c660 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1c670 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  rs.  Return the 
1c680 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
1c690 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 75  first register u
1c6a0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
1c6b0 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49   result..**.** I
1c6c0 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1c6d0 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
1c6e0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63  s a temporary sc
1c6f0 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20  alar, then also 
1c700 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65  write.** that re
1c710 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e  gister number in
1c720 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20  to *piFreeable. 
1c730 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   If the returned
1c740 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
1c750 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  .** is not a tem
1c760 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68 65  porary or if the
1c770 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
1c780 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46   vector set *piF
1c790 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e  reeable.** to 0.
1c7a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
1c7b0 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61  xprCodeVector(Pa
1c7c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1c7d0 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65  r *p, int *piFre
1c7e0 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52  eable){.  int iR
1c7f0 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65  esult;.  int nRe
1c800 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  sult = sqlite3Ex
1c810 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b  prVectorSize(p);
1c820 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d  .  if( nResult==
1c830 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74  1 ){.    iResult
1c840 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1c850 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1c860 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20  , piFreeable);. 
1c870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46   }else{.    *piF
1c880 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  reeable = 0;.   
1c890 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   if( p->op==TK_S
1c8a0 45 4c 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c  ELECT ){.#if SQL
1c8b0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1c8c0 59 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  Y.      iResult 
1c8d0 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  = 0;.#else.     
1c8e0 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   iResult = sqlit
1c8f0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
1c900 70 50 61 72 73 65 2c 20 70 2c 20 30 2c 20 30 29  pParse, p, 0, 0)
1c910 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
1c920 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
1c930 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d  .      iResult =
1c940 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
1c950 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
1c960 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a  Mem += nResult;.
1c970 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1c980 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a  <nResult; i++){.
1c990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c9a0 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c  xprCodeFactorabl
1c9b0 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70  e(pParse, p->x.p
1c9c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1c9d0 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20  , i+iResult);.  
1c9e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c9f0 20 20 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74    return iResult
1ca00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
1ca10 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
1ca20 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
1ca30 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1ca40 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
1ca50 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  ion.  Attempt to
1ca60 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1ca70 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22  ts in register "
1ca80 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75  target"..** Retu
1ca90 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
1caa0 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72  where results ar
1cab0 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
1cac0 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  With this routin
1cad0 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67  e, there is no g
1cae0 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65  uarantee that re
1caf0 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
1cb00 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
1cb10 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
1cb20 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
1cb30 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
1cb40 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
1cb50 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
1cb60 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
1cb70 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
1cb80 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
1cb90 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
1cba0 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
1cbb0 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
1cbc0 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
1cbd0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1cbe0 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
1cbf0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1cc00 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
1cc10 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1cc20 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
1cc30 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
1cc40 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1cc50 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1cc60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1cc70 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
1cc80 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
1cc90 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
1cca0 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
1ccb0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
1ccc0 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
1ccd0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
1cce0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
1ccf0 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
1cd00 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1cd10 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
1cd20 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
1cd30 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
1cd40 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
1cd50 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
1cd60 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20    int r1, r2;   
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1cd80 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
1cd90 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70  numbers */.  Exp
1cda0 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20  r tempX;        
1cdb0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
1cdc0 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  ary expression n
1cdd0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20  ode */.  int p5 
1cde0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1cdf0 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
1ce00 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
1ce10 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29   );.  if( v==0 )
1ce20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1ce30 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1ce40 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
1ce50 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 65 78 70  turn 0;.  }..exp
1ce60 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3a 0a 20  r_code_doover:. 
1ce70 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
1ce80 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c  .    op = TK_NUL
1ce90 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
1cea0 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
1ceb0 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70    }.  switch( op
1cec0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
1ced0 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
1cee0 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67      AggInfo *pAg
1cef0 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  gInfo = pExpr->p
1cf00 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  AggInfo;.      s
1cf10 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1cf20 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49  l *pCol = &pAggI
1cf30 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  nfo->aCol[pExpr-
1cf40 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66  >iAgg];.      if
1cf50 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  ( !pAggInfo->dir
1cf60 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ectMode ){.     
1cf70 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
1cf80 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20  >iMem>0 );.     
1cf90 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e     return pCol->
1cfa0 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iMem;.      }els
1cfb0 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
1cfc0 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
1cfd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1cfe0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1cff0 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66  _Column, pAggInf
1d000 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61  o->sortingIdxPTa
1d010 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1d020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d030 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
1d040 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
1d050 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
1d060 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
1d070 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
1d080 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
1d090 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
1d0a0 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
1d0b0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
1d0c0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61   {.      int iTa
1d0d0 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  b = pExpr->iTabl
1d0e0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  e;.      if( Exp
1d0f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1d100 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  pr, EP_FixedCol)
1d110 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1d120 68 69 73 20 43 4f 4c 55 4d 4e 20 65 78 70 72 65  his COLUMN expre
1d130 73 73 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20  ssion is really 
1d140 61 20 63 6f 6e 73 74 61 6e 74 20 64 75 65 20 74  a constant due t
1d150 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20  o WHERE clause. 
1d160 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
1d170 61 69 6e 74 73 2c 20 61 6e 64 20 74 68 61 74 20  aints, and that 
1d180 63 6f 6e 73 74 61 6e 74 20 69 73 20 63 6f 64 65  constant is code
1d190 64 20 62 79 20 74 68 65 20 70 45 78 70 72 2d 3e  d by the pExpr->
1d1a0 70 4c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a  pLeft.        **
1d1b0 20 65 78 70 72 65 73 73 73 69 6f 6e 2e 20 20 48   expresssion.  H
1d1c0 6f 77 65 76 65 72 2c 20 6d 61 6b 65 20 73 75 72  owever, make sur
1d1d0 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 68  e the constant h
1d1e0 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  as the correct. 
1d1f0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 74 79         ** dataty
1d200 70 65 20 62 79 20 61 70 70 6c 79 69 6e 67 20 74  pe by applying t
1d210 68 65 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  he Affinity of t
1d220 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
1d230 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
1d240 2a 20 63 6f 6e 73 74 61 6e 74 2e 0a 20 20 20 20  * constant..    
1d250 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1d260 6e 74 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65  nt iReg = sqlite
1d270 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1d280 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1d290 4c 65 66 74 2c 74 61 72 67 65 74 29 3b 0a 20 20  Left,target);.  
1d2a0 20 20 20 20 20 20 69 6e 74 20 61 66 66 20 3d 20        int aff = 
1d2b0 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75  sqlite3TableColu
1d2c0 6d 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  mnAffinity(pExpr
1d2d0 2d 3e 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69  ->pTab, pExpr->i
1d2e0 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
1d2f0 20 69 66 28 20 61 66 66 21 3d 53 51 4c 49 54 45   if( aff!=SQLITE
1d300 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  _AFF_BLOB ){.   
1d310 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
1d320 6e 73 74 20 63 68 61 72 20 7a 41 66 66 5b 5d 20  nst char zAff[] 
1d330 3d 20 22 42 5c 30 30 30 43 5c 30 30 30 44 5c 30  = "B\000C\000D\0
1d340 30 30 45 22 3b 0a 20 20 20 20 20 20 20 20 20 20  00E";.          
1d350 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 41  assert( SQLITE_A
1d360 46 46 5f 42 4c 4f 42 3d 3d 27 41 27 20 29 3b 0a  FF_BLOB=='A' );.
1d370 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1d380 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ( SQLITE_AFF_TEX
1d390 54 3d 3d 27 42 27 20 29 3b 0a 20 20 20 20 20 20  T=='B' );.      
1d3a0 20 20 20 20 69 66 28 20 69 52 65 67 21 3d 74 61      if( iReg!=ta
1d3b0 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rget ){.        
1d3c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d3d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1d3e0 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74 29  y, iReg, target)
1d3f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 52  ;.            iR
1d400 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
1d410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d430 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
1d440 69 74 79 2c 20 69 52 65 67 2c 20 31 2c 20 30 2c  ity, iReg, 1, 0,
1d450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d460 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 41               &zA
1d470 66 66 5b 28 61 66 66 2d 27 42 27 29 2a 32 5d 2c  ff[(aff-'B')*2],
1d480 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1d490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1d4a0 65 74 75 72 6e 20 69 52 65 67 3b 0a 20 20 20 20  eturn iReg;.    
1d4b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 54    }.      if( iT
1d4c0 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ab<0 ){.        
1d4d0 69 66 28 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  if( pParse->iSel
1d4e0 66 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20  fTab<0 ){.      
1d4f0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e      /* Generatin
1d500 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  g CHECK constrai
1d510 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  nts or inserting
1d520 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e   into partial in
1d530 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  dex */.         
1d540 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69   return pExpr->i
1d550 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72 73 65 2d  Column - pParse-
1d560 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20  >iSelfTab;.     
1d570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d580 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e      /* Coding an
1d590 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
1d5a0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69   is part of an i
1d5b0 6e 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d  ndex where colum
1d5c0 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20  n names.        
1d5d0 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
1d5e0 78 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74  x refer to the t
1d5f0 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68  able to which th
1d600 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20  e index belongs 
1d610 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61  */.          iTa
1d620 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  b = pParse->iSel
1d630 66 54 61 62 20 2d 20 31 3b 0a 20 20 20 20 20 20  fTab - 1;.      
1d640 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1d650 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1d660 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1d670 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  n(pParse, pExpr-
1d680 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  >pTab,.         
1d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6a0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
1d6b0 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67  lumn, iTab, targ
1d6c0 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
1d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6e0 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a     pExpr->op2);.
1d6f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1d700 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
1d710 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
1d720 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
1d730 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1d740 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1d750 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1d760 5f 54 52 55 45 46 41 4c 53 45 3a 20 7b 0a 20 20  _TRUEFALSE: {.  
1d770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d780 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1d790 67 65 72 2c 20 73 71 6c 69 74 65 33 45 78 70 72  ger, sqlite3Expr
1d7a0 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70 72  TruthValue(pExpr
1d7b0 29 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  ), target);.    
1d7c0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1d7d0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1d7e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1d7f0 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61  ING_POINT.    ca
1d800 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
1d810 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1d820 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1d830 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1d840 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52  ) );.      codeR
1d850 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e  eal(v, pExpr->u.
1d860 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65  zToken, 0, targe
1d870 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1d880 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1d890 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
1d8a0 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
1d8b0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1d8c0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1d8d0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1d8e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d8f0 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
1d900 20 74 61 72 67 65 74 2c 20 70 45 78 70 72 2d 3e   target, pExpr->
1d910 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1d920 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1d930 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1d940 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
1d950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d960 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1d970 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1d980 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1d990 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1d9a0 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
1d9b0 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
1d9c0 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
1d9d0 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  int n;.      con
1d9e0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
1d9f0 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20    char *zBlob;. 
1da00 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1da10 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1da20 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1da30 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1da40 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1da50 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45  en[0]=='x' || pE
1da60 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
1da70 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61  =='X' );.      a
1da80 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1da90 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20  zToken[1]=='\'' 
1daa0 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45  );.      z = &pE
1dab0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d  xpr->u.zToken[2]
1dac0 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69  ;.      n = sqli
1dad0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d  te3Strlen30(z) -
1dae0 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
1daf0 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ( z[n]=='\'' );.
1db00 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71        zBlob = sq
1db10 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73  lite3HexToBlob(s
1db20 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c  qlite3VdbeDb(v),
1db30 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71   z, n);.      sq
1db40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1db50 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c  v, OP_Blob, n/2,
1db60 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f   target, 0, zBlo
1db70 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  b, P4_DYNAMIC);.
1db80 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1db90 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  get;.    }.#endi
1dba0 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
1dbb0 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
1dbc0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1dbd0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1dbe0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1dbf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1dc00 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30  xpr->u.zToken!=0
1dc10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1dc20 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1dc30 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  n[0]!=0 );.     
1dc40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dc50 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c  p2(v, OP_Variabl
1dc60 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
1dc70 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
1dc80 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a    if( pExpr->u.z
1dc90 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20  Token[1]!=0 ){. 
1dca0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1dcb0 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 56 4c  r *z = sqlite3VL
1dcc0 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61  istNumToName(pPa
1dcd0 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 70 45 78  rse->pVList, pEx
1dce0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
1dcf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1dd00 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
1dd10 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63 6d 70 28  =='?' || strcmp(
1dd20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1dd30 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20   z)==0 );.      
1dd40 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74    pParse->pVList
1dd50 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e 64 69  [0] = 0; /* Indi
1dd60 63 61 74 65 20 56 4c 69 73 74 20 6d 61 79 20 6e  cate VList may n
1dd70 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65 6e 6c 61  o longer be enla
1dd80 72 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  rged */.        
1dd90 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
1dda0 64 50 34 28 76 2c 20 28 63 68 61 72 2a 29 7a 2c  dP4(v, (char*)z,
1ddb0 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1ddc0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1ddd0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1dde0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
1ddf0 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65  STER: {.      re
1de00 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54 61 62  turn pExpr->iTab
1de10 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  le;.    }.#ifnde
1de20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
1de30 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ST.    case TK_C
1de40 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  AST: {.      /* 
1de50 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
1de60 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28  he form:   CAST(
1de70 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20  pLeft AS token) 
1de80 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  */.      inReg =
1de90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1dea0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1deb0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
1dec0 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
1ded0 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b  inReg!=target ){
1dee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1def0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1df00 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
1df10 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1df20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
1df30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1df40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1df50 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67  v, OP_Cast, targ
1df60 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
1df70 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1df80 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
1df90 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1dfa0 20 30 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75   0));.      retu
1dfb0 72 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a  rn inReg;.    }.
1dfc0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1dfd0 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20  _OMIT_CAST */.  
1dfe0 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
1dff0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1e000 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d  .      op = (op=
1e010 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20  =TK_IS) ? TK_EQ 
1e020 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70  : TK_NE;.      p
1e030 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  5 = SQLITE_NULLE
1e040 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c  Q;.      /* fall
1e050 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20  -through */.    
1e060 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
1e070 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
1e080 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
1e090 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
1e0a0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
1e0b0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
1e0c0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
1e0d0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1e0e0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1e0f0 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c  3ExprIsVector(pL
1e100 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eft) ){.        
1e110 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72  codeVectorCompar
1e120 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
1e130 20 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29   target, op, p5)
1e140 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e150 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
1e160 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e170 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
1e180 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1e190 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1e1a0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e1b0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1e1c0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1e1d0 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61         codeCompa
1e1e0 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
1e1f0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1e200 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1e210 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20   r1, r2, inReg, 
1e220 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c  SQLITE_STOREP2 |
1e230 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73   p5);.        as
1e240 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
1e250 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1e260 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
1e270 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1e280 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Lt);.        as
1e290 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
1e2a0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1e2b0 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
1e2c0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1e2d0 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Le);.        as
1e2e0 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
1e2f0 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1e300 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
1e310 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1e320 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Gt);.        as
1e330 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
1e340 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1e350 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
1e360 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1e370 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Ge);.        as
1e380 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
1e390 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
1e3a0 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
1e3b0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1e3c0 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Eq);.        as
1e3d0 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
1e3e0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1e3f0 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ne); VdbeCov
1e400 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1e410 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  _Ne);.        te
1e420 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1e430 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
1e440 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1e450 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
1e460 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e470 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1e480 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
1e490 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
1e4a0 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
1e4b0 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
1e4c0 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
1e4d0 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
1e4e0 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
1e4f0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
1e500 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
1e510 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
1e520 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
1e530 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
1e540 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
1e550 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
1e560 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
1e570 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d );            
1e580 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1e590 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73  _AND );.      as
1e5a0 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
1e5b0 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  Or );           
1e5c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e5d0 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20  =TK_OR );.      
1e5e0 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d  assert( TK_PLUS=
1e5f0 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20  =OP_Add );      
1e600 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e610 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20  p==TK_PLUS );.  
1e620 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
1e630 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
1e640 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61 73  t );     testcas
1e650 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20  e( op==TK_MINUS 
1e660 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e670 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
1e680 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74 65  inder );      te
1e690 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
1e6a0 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
1e6b0 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
1e6c0 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20  P_BitAnd );     
1e6d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e6e0 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20  K_BITAND );.    
1e6f0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1e700 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20  OR==OP_BitOr ); 
1e710 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1e720 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b   op==TK_BITOR );
1e730 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e740 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
1e750 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73 74  de );       test
1e760 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41  case( op==TK_SLA
1e770 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  SH );.      asse
1e780 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
1e790 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20  P_ShiftLeft );  
1e7a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e7b0 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_LSHIFT );.    
1e7c0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
1e7d0 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
1e7e0 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65 28  ht );  testcase(
1e7f0 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29   op==TK_RSHIFT )
1e800 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e810 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f  TK_CONCAT==OP_Co
1e820 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65 73  ncat );      tes
1e830 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
1e840 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31  NCAT );.      r1
1e850 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e860 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e870 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1e880 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1e890 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1e8a0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e8b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1e8c0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1e8d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e8e0 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
1e8f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e900 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1e910 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1e920 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1e930 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1e940 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e950 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
1e960 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
1e970 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
1e980 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
1e990 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
1e9a0 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
1e9b0 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
1e9c0 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
1e9d0 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
1e9e0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1e9f0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1ea00 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  et;.#ifndef SQLI
1ea10 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1ea20 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c  _POINT.      }el
1ea30 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  se if( pLeft->op
1ea40 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  ==TK_FLOAT ){.  
1ea50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1ea60 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ea70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1ea80 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  e) );.        co
1ea90 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d  deReal(v, pLeft-
1eaa0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61  >u.zToken, 1, ta
1eab0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72  rget);.        r
1eac0 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 65  eturn target;.#e
1ead0 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
1eae0 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  {.        tempX.
1eaf0 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b  op = TK_INTEGER;
1eb00 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66  .        tempX.f
1eb10 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c  lags = EP_IntVal
1eb20 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b  ue|EP_TokenOnly;
1eb30 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75  .        tempX.u
1eb40 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20  .iValue = 0;.   
1eb50 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1eb60 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1eb70 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72  arse, &tempX, &r
1eb80 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1eb90 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1eba0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1ebb0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1ebc0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1ebd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ebe0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
1ebf0 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74  tract, r2, r1, t
1ec00 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1ec10 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1ec20 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
1ec30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ec40 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1ec50 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
1ec60 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
1ec70 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e   assert( TK_BITN
1ec80 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b  OT==OP_BitNot );
1ec90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1eca0 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20  =TK_BITNOT );.  
1ecb0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
1ecc0 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20  OT==OP_Not );   
1ecd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ece0 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
1ecf0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1ed00 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1ed10 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1ed20 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1ed30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1ed40 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1ed50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ed60 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
1ed70 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62   inReg);.      b
1ed80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ed90 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b  case TK_TRUTH: {
1eda0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75  .      int isTru
1edb0 65 3b 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45  e;    /* IS TRUE
1edc0 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20   or IS NOT TRUE 
1edd0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 6f  */.      int bNo
1ede0 72 6d 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54 52  rmal;   /* IS TR
1edf0 55 45 20 6f 72 20 49 53 20 46 41 4c 53 45 20 2a  UE or IS FALSE *
1ee00 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  /.      r1 = sql
1ee10 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1ee20 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1ee30 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1ee40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ee50 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1ee60 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d  ;.      isTrue =
1ee70 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74   sqlite3ExprTrut
1ee80 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52  hValue(pExpr->pR
1ee90 69 67 68 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f  ight);.      bNo
1eea0 72 6d 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70  rmal = pExpr->op
1eeb0 32 3d 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20  2==TK_IS;.      
1eec0 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65  testcase( isTrue
1eed0 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20   && bNormal);.  
1eee0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
1eef0 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c  sTrue && bNormal
1ef00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ef10 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1ef20 20 4f 50 5f 49 73 54 72 75 65 2c 20 72 31 2c 20   OP_IsTrue, r1, 
1ef30 69 6e 52 65 67 2c 20 21 69 73 54 72 75 65 2c 20  inReg, !isTrue, 
1ef40 69 73 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c  isTrue ^ bNormal
1ef50 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ef60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1ef70 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
1ef80 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
1ef90 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
1efa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1efb0 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
1efc0 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73  ull );   testcas
1efd0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
1efe0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1eff0 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
1f000 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74  _NotNull ); test
1f010 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
1f020 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71  NULL );.      sq
1f030 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f040 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
1f050 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f060 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f070 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f080 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f090 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f0a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f0b0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1f0c0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1f0d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c  dbeAddOp1(v, op,
1f0e0 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65   r1);.      Vdbe
1f0f0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1f100 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20  ==TK_ISNULL);.  
1f110 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f120 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
1f130 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
1f140 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f150 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1f160 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1f170 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1f180 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
1f190 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f1a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
1f1b0 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
1f1c0 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66     AggInfo *pInf
1f1d0 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
1f1e0 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nfo;.      if( p
1f1f0 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
1f200 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1f210 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1f220 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1f230 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f240 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1f250 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
1f260 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20  gregate: %s()", 
1f270 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1f280 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f290 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49         return pI
1f2a0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72  nfo->aFunc[pExpr
1f2b0 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20  ->iAgg].iMem;.  
1f2c0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1f2d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f2e0 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
1f2f0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
1f300 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a  *pFarg;       /*
1f310 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   List of functio
1f320 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
1f330 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20       int nFarg; 
1f340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f350 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f  umber of functio
1f360 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
1f370 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
1f380 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ef;         /* T
1f390 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  he function defi
1f3a0 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  nition object */
1f3b0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1f3c0 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a  r *zId;       /*
1f3d0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
1f3e0 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20  me */.      u32 
1f3f0 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20  constMask = 0;  
1f400 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75     /* Mask of fu
1f410 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1f420 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61   that are consta
1f430 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nt */.      int 
1f440 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1f450 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1f460 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  er */.      sqli
1f470 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1f480 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61  ->db;  /* The da
1f490 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1f4a0 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e  n */.      u8 en
1f4b0 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  c = ENC(db);    
1f4c0 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e    /* The text en
1f4d0 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74  coding used by t
1f4e0 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
1f4f0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
1f500 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Coll = 0;    /* 
1f510 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  A collating sequ
1f520 65 6e 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ence */..#ifndef
1f530 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
1f540 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66  DOWFUNC.      if
1f550 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1f560 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
1f570 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
1f580 64 29 20 26 26 20 70 45 78 70 72 2d 3e 70 57 69  d) && pExpr->pWi
1f590 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  n ){.        ret
1f5a0 75 72 6e 20 70 45 78 70 72 2d 3e 70 57 69 6e 2d  urn pExpr->pWin-
1f5b0 3e 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20 20  >regResult;.    
1f5c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1f5d0 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f    if( ConstFacto
1f5e0 72 4f 6b 28 70 50 61 72 73 65 29 20 26 26 20 73  rOk(pParse) && s
1f5f0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1f600 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
1f610 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
1f620 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63   SQL functions c
1f630 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e  an be expensive.
1f640 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20   So try to move 
1f650 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f  constant functio
1f660 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  ns.        ** ou
1f670 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  t of the inner l
1f680 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61  oop, even if tha
1f690 74 20 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61  t means an extra
1f6a0 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20   OP_Copy. */.   
1f6b0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1f6c0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
1f6d0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1f6e0 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -1);.      }.  
1f6f0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1f700 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1f710 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1f720 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  ) );.      if( E
1f730 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1f740 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
1f750 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ly) ){.        p
1f760 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Farg = 0;.      
1f770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1f780 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Farg = pExpr->x.
1f790 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
1f7a0 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61       nFarg = pFa
1f7b0 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70  rg ? pFarg->nExp
1f7c0 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73  r : 0;.      ass
1f7d0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1f7e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1f7f0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1f800 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
1f810 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
1f820 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
1f830 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
1f840 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  Id, nFarg, enc, 
1f850 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0);.#ifdef SQLIT
1f860 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e  E_ENABLE_UNKNOWN
1f870 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20  _SQL_FUNCTION.  
1f880 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
1f890 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  && pParse->expla
1f8a0 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  in ){.        pD
1f8b0 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
1f8c0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e  Function(db, "un
1f8d0 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65  known", nFarg, e
1f8e0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nc, 0);.      }.
1f8f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
1f900 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66   pDef==0 || pDef
1f910 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29  ->xFinalize!=0 )
1f920 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f930 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1f940 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74  , "unknown funct
1f950 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29  ion: %s()", zId)
1f960 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1f970 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1f980 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72  /* Attempt a dir
1f990 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ect implementati
1f9a0 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d  on of the built-
1f9b0 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e  in COALESCE() an
1f9c0 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c  d.      ** IFNUL
1f9d0 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  L() functions.  
1f9e0 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65  This avoids unne
1f9f0 63 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69  cessary evaluati
1fa00 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  on of.      ** a
1fa10 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68  rguments past th
1fa20 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c  e first non-NULL
1fa30 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
1fa40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
1fa50 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1fa60 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c  SQLITE_FUNC_COAL
1fa70 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ESCE ){.        
1fa80 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20  int endCoalesce 
1fa90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1faa0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1fab0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
1fac0 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  >=2 );.        s
1fad0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1fae0 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
1faf0 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
1fb00 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
1fb10 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =1; i<nFarg; i++
1fb20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1fb30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1fb40 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61  , OP_NotNull, ta
1fb50 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63  rget, endCoalesc
1fb60 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  e);.          Vd
1fb70 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1fb80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fb90 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1fba0 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
1fbb0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
1fbc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1fbd0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1fbe0 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61  eLabel(v, endCoa
1fbf0 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
1fc00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1fc10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c        /* The UNL
1fc20 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e  IKELY() function
1fc30 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68   is a no-op.  Th
1fc40 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20  e result is the 
1fc50 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f  value.      ** o
1fc60 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
1fc70 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
1fc80 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
1fc90 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
1fca0 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20  E_FUNC_UNLIKELY 
1fcb0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1fcc0 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20  t( nFarg>=1 );. 
1fcd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
1fce0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1fcf0 67 65 74 28 70 50 61 72 73 65 2c 20 70 46 61 72  get(pParse, pFar
1fd00 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74  g->a[0].pExpr, t
1fd10 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
1fd20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1fd30 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 68  EBUG.      /* Th
1fd40 65 20 41 46 46 49 4e 49 54 59 28 29 20 66 75 6e  e AFFINITY() fun
1fd50 63 74 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ction evaluates 
1fd60 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  to a string that
1fd70 20 64 65 73 63 72 69 62 65 73 0a 20 20 20 20 20   describes.     
1fd80 20 2a 2a 20 74 68 65 20 74 79 70 65 20 61 66 66   ** the type aff
1fd90 69 6e 69 74 79 20 6f 66 20 74 68 65 20 61 72 67  inity of the arg
1fda0 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20  ument.  This is 
1fdb0 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
1fdc0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
1fdd0 20 53 51 4c 69 74 65 20 74 79 70 65 20 6c 6f 67   SQLite type log
1fde0 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
1fdf0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
1fe00 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
1fe10 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 20 29 7b  FUNC_AFFINITY ){
1fe20 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1fe30 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b  har *azAff[] = {
1fe40 20 22 62 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c   "blob", "text",
1fe50 20 22 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e 74   "numeric", "int
1fe60 65 67 65 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b  eger", "real" };
1fe70 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66  .        char af
1fe80 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  f;.        asser
1fe90 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20  t( nFarg==1 );. 
1fea0 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c         aff = sql
1feb0 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1fec0 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78  (pFarg->a[0].pEx
1fed0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pr);.        sql
1fee0 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
1fef0 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 0a 20  ng(v, target, . 
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66               aff
1ff20 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c   ? azAff[aff-SQL
1ff30 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20  ITE_AFF_BLOB] : 
1ff40 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20 20  "none");.       
1ff50 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1ff60 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
1ff70 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1ff80 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
1ff90 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26        if( i<32 &
1ffa0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
1ffb0 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61  onstant(pFarg->a
1ffc0 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
1ffd0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ffe0 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  ( i==31 );.     
1fff0 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c       constMask |
20000 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a  = MASKBIT32(i);.
20010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20020 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
20030 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
20040 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d  FUNC_NEEDCOLL)!=
20050 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20  0 && !pColl ){. 
20060 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
20070 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
20080 53 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72  Seq(pParse, pFar
20090 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  g->a[i].pExpr);.
200a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
200b0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72  }.      if( pFar
200c0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  g ){.        if(
200d0 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20   constMask ){.  
200e0 20 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61          r1 = pPa
200f0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
20100 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
20110 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20  Mem += nFarg;.  
20120 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20130 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
20140 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
20150 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a  pParse, nFarg);.
20160 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
20170 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68     /* For length
20180 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20  () and typeof() 
20190 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61  functions with a
201a0 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74   column argument
201b0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  ,.        ** set
201c0 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65   the P5 paramete
201d0 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75  r to the OP_Colu
201e0 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46  mn opcode to OPF
201f0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20  LAG_LENGTHARG.  
20200 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c        ** or OPFL
20210 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73  AG_TYPEOFARG res
20220 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76  pectively, to av
20230 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
20240 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  data.        ** 
20250 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20  loading..       
20260 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
20270 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
20280 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f   & (SQLITE_FUNC_
20290 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55  LENGTH|SQLITE_FU
202a0 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29  NC_TYPEOF))!=0 )
202b0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  {.          u8 e
202c0 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20  xprOp;.         
202d0 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d   assert( nFarg==
202e0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  1 );.          a
202f0 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b  ssert( pFarg->a[
20300 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  0].pExpr!=0 );. 
20310 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20           exprOp 
20320 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  = pFarg->a[0].pE
20330 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20  xpr->op;.       
20340 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54     if( exprOp==T
20350 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72  K_COLUMN || expr
20360 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  Op==TK_AGG_COLUM
20370 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
20380 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
20390 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46  FUNC_LENGTH==OPF
203a0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b  LAG_LENGTHARG );
203b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
203c0 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
203d0 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f  _TYPEOF==OPFLAG_
203e0 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20  TYPEOFARG );.   
203f0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
20400 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  e( pDef->funcFla
20410 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47  gs & OPFLAG_LENG
20420 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  THARG );.       
20430 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d       pFarg->a[0]
20440 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20  .pExpr->op2 = . 
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20460 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
20470 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   & (OPFLAG_LENGT
20480 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45  HARG|OPFLAG_TYPE
20490 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20  OFARG);.        
204a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
204b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
204c0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
204d0 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31  Parse, pFarg, r1
204e0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
204f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20500 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c       SQLITE_ECEL
20510 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c  _DUP|SQLITE_ECEL
20520 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20  _FACTOR);.      
20530 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
20540 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  1 = 0;.      }.#
20550 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20560 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
20570 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
20580 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
20590 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
205a0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
205b0 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
205c0 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
205d0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
205e0 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
205f0 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
20600 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
20610 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
20620 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
20630 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
20640 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
20650 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
20660 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
20670 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
20680 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
20690 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
206a0 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
206b0 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
206c0 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
206d0 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
206e0 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
206f0 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
20700 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
20710 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
20720 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
20730 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
20740 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
20750 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
20760 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
20770 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
20780 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
20790 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
207a0 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
207b0 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
207c0 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
207d0 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
207e0 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
207f0 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
20800 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20810 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20  if( nFarg>=2 && 
20820 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
20830 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
20840 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
20850 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
20860 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
20870 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
20880 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  rg->a[1].pExpr);
20890 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
208a0 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20   nFarg>0 ){.    
208b0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
208c0 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
208d0 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
208e0 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
208f0 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
20900 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
20910 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
20920 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
20930 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
20940 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
20950 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
20960 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
20970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20980 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
20990 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
209a0 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
209b0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
209c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
209d0 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51  ENABLE_OFFSET_SQ
209e0 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28  L_FUNC.      if(
209f0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
20a00 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4f   & SQLITE_FUNC_O
20a10 46 46 53 45 54 20 29 7b 0a 20 20 20 20 20 20 20  FFSET ){.       
20a20 20 45 78 70 72 20 2a 70 41 72 67 20 3d 20 70 46   Expr *pArg = pF
20a30 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  arg->a[0].pExpr;
20a40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
20a50 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  g->op==TK_COLUMN
20a60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
20a70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
20a80 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c 20 70 41  v, OP_Offset, pA
20a90 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70 41 72 67  rg->iTable, pArg
20aa0 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
20ab0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
20ac0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
20ad0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20ae0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
20af0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
20b00 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
20b10 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
20b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20b30 64 64 4f 70 34 28 76 2c 20 70 50 61 72 73 65 2d  ddOp4(v, pParse-
20b40 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f 50  >iSelfTab ? OP_P
20b50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46 75  ureFunc0 : OP_Fu
20b60 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20 20  nction0,.       
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b80 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31     constMask, r1
20b90 2c 20 74 61 72 67 65 74 2c 20 28 63 68 61 72 2a  , target, (char*
20ba0 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  )pDef, P4_FUNCDE
20bb0 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  F);.        sqli
20bc0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
20bd0 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20  v, (u8)nFarg);. 
20be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20bf0 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d   nFarg && constM
20c00 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ask==0 ){.      
20c10 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
20c20 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
20c30 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20  , r1, nFarg);.  
20c40 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
20c50 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
20c60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20c70 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
20c80 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
20c90 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
20ca0 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  LECT: {.      in
20cb0 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65  t nCol;.      te
20cc0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
20cd0 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
20ce0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
20cf0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
20d00 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  if( op==TK_SELEC
20d10 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78  T && (nCol = pEx
20d20 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
20d30 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31  EList->nExpr)!=1
20d40 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20d50 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
20d60 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20  r(pParse, nCol, 
20d70 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
20d80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20d90 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
20da0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
20db0 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  pr, 0, 0);.     
20dc0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
20dd0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
20de0 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a  K_SELECT_COLUMN:
20df0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
20e00 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
20e10 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d  >pLeft->iTable==
20e20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
20e30 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
20e40 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  e = sqlite3CodeS
20e50 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
20e60 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
20e70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
20e80 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
20e90 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  r->iTable==0 || 
20ea0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pExpr->pLeft->op
20eb0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
20ec0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
20ed0 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 26 26  iTable.       &&
20ee0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
20ef0 28 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  (n = sqlite3Expr
20f00 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
20f10 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20 20 20 20  ->pLeft)) .     
20f20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20f30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
20f40 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20  se, "%d columns 
20f50 61 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75  assigned %d valu
20f60 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  es",.           
20f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f80 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
20f90 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  le, n);.      }.
20fa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
20fb0 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
20fc0 65 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  e + pExpr->iColu
20fd0 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  mn;.    }.    ca
20fe0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
20ff0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
21000 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
21010 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
21020 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
21030 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
21040 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
21050 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21060 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
21070 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
21080 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
21090 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
210a0 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
210b0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
210c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
210d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
210e0 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
210f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21100 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
21110 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
21120 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21130 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
21140 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29  dImm, target, 0)
21150 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21160 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
21170 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
21180 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
21190 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  get;.    }.#endi
211a0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
211b0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20  _SUBQUERY */... 
211c0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20     /*.    **    
211d0 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
211e0 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
211f0 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65  This is equivale
21200 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20  nt to.    **.   
21210 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
21220 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  x<=z.    **.    
21230 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69  ** X is stored i
21240 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
21250 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72      ** Y is stor
21260 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
21270 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a  st->a[0].pExpr..
21280 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72      ** Z is stor
21290 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
212a0 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a  st->a[1].pExpr..
212b0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
212c0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
212d0 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
212e0 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
212f0 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29  r, target, 0, 0)
21300 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
21310 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
21320 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20   case TK_SPAN:. 
21330 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41     case TK_COLLA
21340 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  TE: .    case TK
21350 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
21360 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70  pExpr = pExpr->p
21370 4c 65 66 74 3b 0a 20 20 20 20 20 20 67 6f 74 6f  Left;.      goto
21380 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65   expr_code_doove
21390 72 3b 20 2f 2a 20 32 30 31 38 2d 30 34 2d 32 38  r; /* 2018-04-28
213a0 3a 20 50 72 65 76 65 6e 74 20 64 65 65 70 20 72  : Prevent deep r
213b0 65 63 75 72 73 69 6f 6e 2e 20 4f 53 53 46 75 7a  ecursion. OSSFuz
213c0 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  z. */.    }..   
213d0 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52   case TK_TRIGGER
213e0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
213f0 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b  the opcode is TK
21400 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74  _TRIGGER, then t
21410 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
21420 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20   a reference.   
21430 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d     ** to a colum
21440 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f  n in the new.* o
21450 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  r old.* pseudo-t
21460 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
21470 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67  to.      ** trig
21480 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e  ger programs. In
21490 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e   this case Expr.
214a0 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
214b0 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   1 for the.     
214c0 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f   ** new.* pseudo
214d0 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72  -table, or 0 for
214e0 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
214f0 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43  o-table. Expr.iC
21500 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69  olumn.      ** i
21510 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
21520 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64  umn of the pseud
21530 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c  o-table to read,
21540 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20   or to -1 to.   
21550 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72     ** read the r
21560 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20  owid field..    
21570 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
21580 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
21590 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
215a0 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70  g an OP_Param op
215b0 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20  code. The p1.   
215c0 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
215d0 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20  is set to 0 for 
215e0 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66  an old.rowid ref
215f0 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69  erence, or to (i
21600 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  +1).      ** to 
21610 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65  reference anothe
21620 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  r column of the 
21630 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
21640 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20  le, where .     
21650 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
21660 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
21670 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69  . For a new.rowi
21680 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20  d reference, p1 
21690 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  is.      ** set 
216a0 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20  to (n+1), where 
216b0 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
216c0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61  of columns in ea
216d0 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  ch pseudo-table.
216e0 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
216f0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
21700 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e   other column in
21710 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64   the new.* pseud
21720 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20  o-table, p1.    
21730 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28    ** is set to (
21740 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20  n+2+i), where n 
21750 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66  and i are as def
21760 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e  ined previously.
21770 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78   For.      ** ex
21780 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
21790 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69  ble on which tri
217a0 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20  ggers are being 
217b0 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a  fired is.      *
217c0 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20  * declared as:. 
217d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
217e0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
217f0 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
21800 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  **.      ** Then
21810 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74   p1 is interpret
21820 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
21830 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
21840 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20     p1==0   ->   
21850 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70   old.rowid     p
21860 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==3   ->    new
21870 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20  .rowid.      ** 
21880 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20    p1==1   ->    
21890 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31  old.a         p1
218a0 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==4   ->    new.
218b0 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  a.      **   p1=
218c0 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62  =2   ->    old.b
218d0 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20           p1==5  
218e0 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20   ->    new.b    
218f0 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20     .      */.   
21900 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
21910 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
21920 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
21930 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
21940 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
21950 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
21960 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
21970 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
21980 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
21990 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
219a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
219b0 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
219c0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
219d0 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
219e0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
219f0 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
21a00 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
21a10 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
21a20 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
21a30 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
21a40 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
21a50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21a60 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
21a70 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
21a80 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
21a90 72 5b 25 64 5d 3d 25 73 2e 25 73 22 2c 20 74 61  r[%d]=%s.%s", ta
21aa0 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 28 70  rget,.        (p
21ab0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
21ac0 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
21ad0 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
21ae0 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
21af0 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62  d" : pExpr->pTab
21b00 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
21b10 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a 20 20  olumn].zName).  
21b20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66      ));..#ifndef
21b30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
21b40 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
21b50 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
21b60 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  mn has REAL affi
21b70 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72  nity, it may cur
21b80 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
21b90 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
21ba0 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f  integer. Use OP_
21bb0 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20  RealAffinity to 
21bc0 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
21bd0 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20  really real..   
21be0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
21bf0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30  VIDENCE-OF: R-60
21c00 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65  985-57662 SQLite
21c10 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
21c20 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a  e value back to.
21c30 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e        ** floatin
21c40 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74  g point when ext
21c50 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20  racting it from 
21c60 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  the record.  */.
21c70 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
21c80 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20  >iColumn>=0 .   
21c90 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f      && pTab->aCo
21ca0 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
21cb0 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
21cc0 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20  TE_AFF_REAL.    
21cd0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
21ce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
21cf0 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
21d00 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  y, target);.    
21d10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
21d20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
21d30 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f     case TK_VECTO
21d40 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
21d50 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
21d60 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
21d70 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62  sused");.      b
21d80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
21d90 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c   case TK_IF_NULL
21da0 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ROW: {.      in
21db0 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20 20  t addrINR;.     
21dc0 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69 74   addrINR = sqlit
21dd0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
21de0 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70 45  OP_IfNullRow, pE
21df0 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
21e00 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
21e10 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
21e20 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
21e30 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
21e40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21e50 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
21e60 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20 73 71  drINR);.      sq
21e70 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
21e80 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20 69 6e  3(v, addrINR, in
21e90 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
21ea0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
21eb0 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
21ec0 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
21ed0 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
21ee0 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
21ef0 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
21f00 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
21f10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
21f20 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
21f30 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
21f40 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
21f50 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
21f60 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
21f70 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
21f80 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
21f90 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
21fa0 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
21fb0 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
21fc0 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
21fd0 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
21fe0 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
21ff0 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
22000 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
22010 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
22020 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
22030 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
22040 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
22050 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
22060 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20   is in the last 
22070 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72  element of pExpr
22080 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78  ->x.pList if pEx
22090 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
220a0 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64  pr is.    ** odd
220b0 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
220c0 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
220d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
220e0 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74  ments in x.pList
220f0 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c  .    ** is even,
22100 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74   then Y is omitt
22110 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65  ed and the "othe
22120 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73  rwise" result is
22130 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
22140 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
22150 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
22160 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
22170 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
22180 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
22190 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
221a0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
221b0 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
221c0 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
221d0 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
221e0 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
221f0 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
22200 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
22210 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
22220 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
22230 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
22240 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
22250 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
22260 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22280 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
22290 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
222a0 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
222b0 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
222c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222d0 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
222e0 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
222f0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
22300 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22320 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
22330 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
22340 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
22350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22360 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
22370 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
22380 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223a0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
223b0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
223c0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
223d0 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
223e0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
223f0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
22400 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
22410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22420 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
22430 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
22440 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22460 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
22470 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
22480 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
22490 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
224a0 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
224b0 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
224c0 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 0a  Ei (form B) */..
224d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
224e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
224f0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
22500 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ct) && pExpr->x.
22510 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61  pList );.      a
22520 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70  ssert(pExpr->x.p
22530 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
22540 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
22550 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
22560 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d  .      aListelem
22570 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
22580 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69      nExpr = pELi
22590 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
225a0 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69   endLabel = sqli
225b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
225c0 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  (v);.      if( (
225d0 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pX = pExpr->pLef
225e0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
225f0 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20   tempX = *pX;.  
22600 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22610 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pX->op==TK_COLUM
22620 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  N );.        exp
22630 72 54 6f 52 65 67 69 73 74 65 72 28 26 74 65 6d  rToRegister(&tem
22640 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74  pX, exprCodeVect
22650 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70  or(pParse, &temp
22660 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a  X, &regFree1));.
22670 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
22680 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
22690 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
226a0 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c 20 73  &opCompare, 0, s
226b0 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72 65 29  izeof(opCompare)
226c0 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  );.        opCom
226d0 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b  pare.op = TK_EQ;
226e0 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
226f0 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d 70  re.pLeft = &temp
22700 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74  X;.        pTest
22710 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20   = &opCompare;. 
22720 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74         /* Ticket
22730 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31   b351d95f9cd5ef1
22740 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38  7e9d9dbae18f5ca8
22750 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20  611190001:.     
22760 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20     ** The value 
22770 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68  in regFree1 migh
22780 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69  t get SCopy-ed i
22790 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73  nto the file res
227a0 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ult..        ** 
227b0 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  So make sure tha
227c0 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72  t the regFree1 r
227d0 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72  egister is not r
227e0 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a  eused for other.
227f0 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f          ** purpo
22800 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  ses and possibly
22810 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a   overwritten.  *
22820 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65  /.        regFre
22830 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  e1 = 0;.      }.
22840 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
22850 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29  <nExpr-1; i=i+2)
22860 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  {.        if( pX
22870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
22880 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29  sert( pTest!=0 )
22890 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f  ;.          opCo
228a0 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61  mpare.pRight = a
228b0 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
228c0 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
228d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73  {.          pTes
228e0 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
228f0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
22900 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61  }.        nextCa
22910 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
22920 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
22930 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22940 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pTest->op==TK_CO
22950 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
22960 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
22970 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74  se(pParse, pTest
22980 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49  , nextCase, SQLI
22990 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
229a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
229b0 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
229c0 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  .pExpr->op==TK_C
229d0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
229e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
229f0 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
22a00 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74  em[i+1].pExpr, t
22a10 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
22a20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
22a30 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  v, endLabel);.  
22a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22a50 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
22a60 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20   nextCase);.    
22a70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e    }.      if( (n
22a80 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20  Expr&1)!=0 ){.  
22a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22aa0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
22ab0 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d  List->a[nExpr-1]
22ac0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
22ad0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22af0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
22b00 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
22b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
22b20 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
22b30 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65  Label(v, endLabe
22b40 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
22b50 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
22b60 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
22b70 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
22b80 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  AISE: {.      as
22b90 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66  sert( pExpr->aff
22ba0 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  inity==OE_Rollba
22bb0 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ck .           |
22bc0 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
22bd0 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20  y==OE_Abort.    
22be0 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
22bf0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61  >affinity==OE_Fa
22c00 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  il.           ||
22c10 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
22c20 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20  ==OE_Ignore.    
22c30 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21    );.      if( !
22c40 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
22c50 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
22c60 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
22c70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
22c90 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
22ca0 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
22cb0 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
22cc0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
22cd0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
22ce0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
22cf0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
22d00 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
22d10 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
22d20 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
22d30 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
22d40 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
22d50 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
22d60 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
22d70 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
22d80 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
22d90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22da0 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20  ddOp4(.         
22db0 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53     v, OP_Halt, S
22dc0 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e  QLITE_OK, OE_Ign
22dd0 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75  ore, 0, pExpr->u
22de0 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20  .zToken,0);.    
22df0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
22e00 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
22e10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22e20 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
22e30 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43  pParse, SQLITE_C
22e40 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
22e50 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e70 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
22e80 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
22e90 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
22ea0 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
22eb0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
22ec0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
22ed0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
22ee0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
22ef0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
22f00 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
22f10 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
22f20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
22f30 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63  Factor out the c
22f40 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ode of the given
22f50 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69   expression to i
22f60 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
22f70 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  me..**.** If reg
22f80 44 65 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65  Dest>=0 then the
22f90 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79   result is alway
22fa0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74  s stored in that
22fb0 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 74 68   register and th
22fc0 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e  e.** result is n
22fd0 6f 74 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66  ot reusable.  If
22fe0 20 72 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20   regDest<0 then 
22ff0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
23000 66 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72  free to .** stor
23010 65 20 74 68 65 20 76 61 6c 75 65 20 77 68 65 72  e the value wher
23020 65 65 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20  eever it wants. 
23030 20 54 68 65 20 72 65 67 69 73 74 65 72 20 77 68   The register wh
23040 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ere the expressi
23050 6f 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  on .** is stored
23060 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57   is returned.  W
23070 68 65 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74  hen regDest<0, t
23080 77 6f 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70  wo identical exp
23090 72 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a  ressions will.**
230a0 20 63 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d   code to the sam
230b0 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  e register..*/.i
230c0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
230d0 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73  deAtInit(.  Pars
230e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
230f0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
23100 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
23110 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  r,      /* The e
23120 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64  xpression to cod
23130 65 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20  e when the VDBE 
23140 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20  initializes */. 
23150 20 69 6e 74 20 72 65 67 44 65 73 74 20 20 20 20   int regDest    
23160 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
23170 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
23180 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
23190 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73  xprList *p;.  as
231a0 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f  sert( ConstFacto
231b0 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20  rOk(pParse) );. 
231c0 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f   p = pParse->pCo
231d0 6e 73 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72  nstExpr;.  if( r
231e0 65 67 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b  egDest<0 && p ){
231f0 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
23200 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
23210 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
23220 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c   for(pItem=p->a,
23230 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30   i=p->nExpr; i>0
23240 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b  ; pItem++, i--){
23250 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
23260 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71  ->reusable && sq
23270 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
23280 28 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  (0,pItem->pExpr,
23290 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a  pExpr,-1)==0 ){.
232a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
232b0 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78  Item->u.iConstEx
232c0 70 72 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20  prReg;.      }. 
232d0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72     }.  }.  pExpr
232e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
232f0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
23300 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73  xpr, 0);.  p = s
23310 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
23320 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20  pend(pParse, p, 
23330 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20  pExpr);.  if( p 
23340 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20 45  ){.     struct E
23350 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
23360 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
23370 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49  Expr-1];.     pI
23380 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20  tem->reusable = 
23390 72 65 67 44 65 73 74 3c 30 3b 0a 20 20 20 20 20  regDest<0;.     
233a0 69 66 28 20 72 65 67 44 65 73 74 3c 30 20 29 20  if( regDest<0 ) 
233b0 72 65 67 44 65 73 74 20 3d 20 2b 2b 70 50 61 72  regDest = ++pPar
233c0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70  se->nMem;.     p
233d0 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78  Item->u.iConstEx
233e0 70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b  prReg = regDest;
233f0 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70  .  }.  pParse->p
23400 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 20  ConstExpr = p;. 
23410 20 72 65 74 75 72 6e 20 72 65 67 44 65 73 74 3b   return regDest;
23420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
23430 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
23440 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
23450 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  n and store the 
23460 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
23470 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74  a register.  Ret
23480 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
23490 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68   number where th
234a0 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65  e results.** are
234b0 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   stored..**.** I
234c0 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  f the register i
234d0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  s a temporary re
234e0 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20  gister that can 
234f0 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a  be deallocated,.
23500 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74  ** then write it
23510 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  s number into *p
23520 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73  Reg.  If the res
23530 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
23540 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  not.** a tempora
23550 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ry, then set *pR
23560 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  eg to zero..**.*
23570 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
23580 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
23590 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
235a0 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a  t generate this.
235b0 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20  ** code to fill 
235c0 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20  the register in 
235d0 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
235e0 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  on section of th
235f0 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61  e.** VDBE progra
23600 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  m, in order to f
23610 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20  actor it out of 
23620 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c  the evaluation l
23630 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oop..*/.int sqli
23640 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
23650 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
23660 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
23670 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32  *pReg){.  int r2
23680 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
23690 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
236a0 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28  te(pExpr);.  if(
236b0 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
236c0 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78  Parse).   && pEx
236d0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
236e0 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65  TER.   && sqlite
236f0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
23700 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20  otJoin(pExpr).  
23710 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20  ){.    *pReg  = 
23720 30 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69  0;.    r2 = sqli
23730 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
23740 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
23750 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   -1);.  }else{. 
23760 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
23770 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
23780 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20  arse);.    r2 = 
23790 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
237a0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
237b0 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66  xpr, r1);.    if
237c0 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20  ( r2==r1 ){.    
237d0 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20    *pReg = r1;.  
237e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
237f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
23800 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
23810 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20  ;.      *pReg = 
23820 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
23830 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a  eturn r2;.}../*.
23840 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
23850 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
23860 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
23870 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
23880 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
23890 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
238a0 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
238b0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
238c0 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
238d0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
238e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
238f0 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50  prCode(Parse *pP
23900 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
23910 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
23920 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20    int inReg;..  
23930 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
23940 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
23950 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
23960 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72  ( pExpr && pExpr
23970 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
23980 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  R ){.    sqlite3
23990 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
239a0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70  e->pVdbe, OP_Cop
239b0 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  y, pExpr->iTable
239c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c  , target);.  }el
239d0 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20  se{.    inReg = 
239e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
239f0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
23a00 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
23a10 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
23a20 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50  ->pVdbe!=0 || pP
23a30 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
23a40 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
23a50 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
23a60 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  && pParse->pVdbe
23a70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23a80 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
23a90 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
23aa0 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
23ab0 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  et);.    }.  }.}
23ac0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74  ../*.** Make a t
23ad0 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66  ransient copy of
23ae0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
23af0 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20  r and then code 
23b00 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  it using.** sqli
23b10 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20  te3ExprCode().  
23b20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
23b30 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c  ks just like sql
23b40 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a  ite3ExprCode().*
23b50 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  * except that th
23b60 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69  e input expressi
23b70 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  on is guaranteed
23b80 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64   to be unchanged
23b90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23ba0 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61  3ExprCodeCopy(Pa
23bb0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
23bc0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
23bd0 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  rget){.  sqlite3
23be0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
23bf0 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c  b;.  pExpr = sql
23c00 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
23c10 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28  pExpr, 0);.  if(
23c20 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
23c30 65 64 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  ed ) sqlite3Expr
23c40 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
23c50 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73  pr, target);.  s
23c60 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
23c70 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (db, pExpr);.}..
23c80 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
23c90 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
23ca0 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
23cb0 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
23cc0 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
23cd0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
23ce0 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
23cf0 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
23d00 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
23d10 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
23d20 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
23d30 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
23d40 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
23d50 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f  ine.** might cho
23d60 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20  ose to code the 
23d70 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e  expression at in
23d80 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
23d90 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
23da0 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72  e3ExprCodeFactor
23db0 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
23dc0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
23dd0 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
23de0 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f  if( pParse->okCo
23df0 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c  nstFactor && sql
23e00 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
23e10 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29  ntNotJoin(pExpr)
23e20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
23e30 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
23e40 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
23e50 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  get);.  }else{. 
23e60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
23e70 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
23e80 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d  , target);.  }.}
23e90 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
23ea0 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75   code that evalu
23eb0 61 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65  ates the given e
23ec0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75  xpression and pu
23ed0 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ts the result.**
23ee0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
23ef0 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  get..**.** Also 
23f00 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
23f10 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
23f20 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68  sults into anoth
23f30 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73  er "cache" regis
23f40 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66  ter.** and modif
23f50 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  y the expression
23f60 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
23f70 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61  t time it is eva
23f80 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72  luated,.** the r
23f90 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20  esult is a copy 
23fa0 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67  of the cache reg
23fb0 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ister..**.** Thi
23fc0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
23fd0 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  d for expression
23fe0 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  s that are used 
23ff0 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d  multiple .** tim
24000 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76  es.  They are ev
24010 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64  aluated once and
24020 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
24030 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
24040 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f  * are reused..*/
24050 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
24060 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61  rCodeAndCache(Pa
24070 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
24080 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
24090 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
240a0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
240b0 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20  ;.  int iMem;.. 
240c0 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
240d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
240e0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
240f0 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74  ISTER );.  sqlit
24100 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
24110 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
24120 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50  );.  iMem = ++pP
24130 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
24140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24150 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67  v, OP_Copy, targ
24160 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70  et, iMem);.  exp
24170 72 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70  rToRegister(pExp
24180 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a  r, iMem);.}../*.
24190 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
241a0 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65   that pushes the
241b0 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20   value of every 
241c0 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67  element of the g
241d0 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
241e0 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73  on list into a s
241f0 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
24200 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  ters beginning a
24210 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  t target..**.** 
24220 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
24230 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76  r of elements ev
24240 61 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e 75  aluated.  The nu
24250 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 77 69  mber returned wi
24260 6c 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62 65  ll.** usually be
24270 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62 75   pList->nExpr bu
24280 74 20 6d 69 67 68 74 20 62 65 20 72 65 64 75 63  t might be reduc
24290 65 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45  ed if SQLITE_ECE
242a0 4c 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73 20  L_OMITREF.** is 
242b0 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  defined..**.** T
242c0 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44  he SQLITE_ECEL_D
242d0 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73  UP flag prevents
242e0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66   the arguments f
242f0 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c  rom being.** fil
24300 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f  led using OP_SCo
24310 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73  py.  OP_Copy mus
24320 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
24330 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  d..**.** The SQL
24340 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20  ITE_ECEL_FACTOR 
24350 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20  argument allows 
24360 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
24370 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74  ts to be.** fact
24380 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e  ored out into in
24390 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64  itialization cod
243a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  e..**.** The SQL
243b0 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61  ITE_ECEL_REF fla
243c0 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70  g means that exp
243d0 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
243e0 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70  list with.** Exp
243f0 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f  rList.a[].u.x.iO
24400 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65  rderByCol>0 have
24410 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76   already been ev
24420 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72  aluated and stor
24430 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ed.** in registe
24440 72 73 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e  rs at srcReg, an
24450 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63  d so the value c
24460 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f  an be copied fro
24470 6d 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20 53  m there..** If S
24480 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52  QLITE_ECEL_OMITR
24490 45 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c 20  EF is also set, 
244a0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20  then the values 
244b0 77 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72 42  with u.x.iOrderB
244c0 79 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73 69  yCol>0.** are si
244d0 6d 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61 74  mply omitted rat
244e0 68 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20 63  her than being c
244f0 6f 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52 65  opied from srcRe
24500 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
24510 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
24520 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
24530 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
24540 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
24550 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
24560 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
24570 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
24580 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  coded */.  int t
24590 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a  arget,        /*
245a0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
245b0 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
245c0 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20   srcReg,        
245d0 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74  /* Source regist
245e0 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43  ers if SQLITE_EC
245f0 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66  EL_REF */.  u8 f
24600 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
24610 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20  * SQLITE_ECEL_* 
24620 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74  flags */.){.  st
24630 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
24640 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
24650 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63   i, j, n;.  u8 c
24660 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26  opyOp = (flags &
24670 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
24680 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50  ) ? OP_Copy : OP
24690 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a  _SCopy;.  Vdbe *
246a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
246b0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  e;.  assert( pLi
246c0 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  st!=0 );.  asser
246d0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
246e0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
246f0 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a  >pVdbe!=0 );  /*
24700 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73   Never gets this
24710 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a   far otherwise *
24720 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  /.  n = pList->n
24730 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e  Expr;.  if( !Con
24740 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
24750 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53  e) ) flags &= ~S
24760 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
24770 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  R;.  for(pItem=p
24780 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
24790 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  n; i++, pItem++)
247a0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
247b0 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r = pItem->pExpr
247c0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
247d0 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
247e0 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28  FERENCES.    if(
247f0 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52   pItem->bSorterR
24800 65 66 20 29 7b 0a 20 20 20 20 20 20 69 2d 2d 3b  ef ){.      i--;
24810 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20  .      n--;.    
24820 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
24830 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
24840 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d  LITE_ECEL_REF)!=
24850 30 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d  0 && (j = pItem-
24860 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
24870 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  )>0 ){.      if(
24880 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
24890 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a  ECEL_OMITREF ){.
248a0 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20          i--;.   
248b0 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20       n--;.      
248c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
248d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
248e0 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72  (v, copyOp, j+sr
248f0 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69  cReg-1, target+i
24900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
24910 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
24920 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  & SQLITE_ECEL_FA
24930 43 54 4f 52 29 21 3d 30 0a 20 20 20 20 20 20 20  CTOR)!=0.       
24940 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
24950 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
24960 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 20 20 29  oin(pExpr).    )
24970 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
24980 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
24990 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
249a0 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73  get+i);.    }els
249b0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52  e{.      int inR
249c0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
249d0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
249e0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
249f0 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  +i);.      if( i
24a00 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  nReg!=target+i )
24a10 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
24a20 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69   *pOp;.        i
24a30 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f  f( copyOp==OP_Co
24a40 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  py.         && (
24a50 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47  pOp=sqlite3VdbeG
24a60 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70  etOp(v, -1))->op
24a70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  code==OP_Copy.  
24a80 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
24a90 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52  1+pOp->p3+1==inR
24aa0 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
24ab0 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31  Op->p2+pOp->p3+1
24ac0 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20  ==target+i.     
24ad0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
24ae0 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20  pOp->p3++;.     
24af0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24b00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24b10 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
24b20 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69   inReg, target+i
24b30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
24b40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
24b50 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
24b60 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
24b70 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
24b80 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
24b90 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
24ba0 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
24bb0 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
24bc0 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
24bd0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
24be0 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
24bf0 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
24c00 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
24c10 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
24c20 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f  ** elimination o
24c30 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78  f x..**.** The x
24c40 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72  JumpIf parameter
24c50 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61   determines deta
24c60 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55  ils:.**.**    NU
24c70 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
24c80 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20        Store the 
24c90 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69  boolean result i
24ca0 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20  n reg[dest].**  
24cb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
24cc0 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74  rue:      Jump t
24cd0 6f 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a  o dest if true.*
24ce0 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  *    sqlite3Expr
24cf0 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d  IfFalse:     Jum
24d00 70 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c  p to dest if fal
24d10 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d  se.**.** The jum
24d20 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65  pIfNull paramete
24d30 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  r is ignored if 
24d40 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e  xJumpIf is NULL.
24d50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24d60 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
24d70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
24d80 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
24d90 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
24da0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24db0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
24dc0 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45     /* The BETWEE
24dd0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
24de0 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
24df0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
24e00 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61  ination or stora
24e10 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20  ge location */. 
24e20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50   void (*xJump)(P
24e30 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c  arse*,Expr*,int,
24e40 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20  int), /* Action 
24e50 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74  to take */.  int
24e60 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
24e70 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * Take the jump 
24e80 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  if the BETWEEN i
24e90 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78  s NULL */.){. Ex
24ea0 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20  pr exprAnd;     
24eb0 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61  /* The AND opera
24ec0 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44  tor in  x>=y AND
24ed0 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72   x<=z  */.  Expr
24ee0 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a   compLeft;    /*
24ef0 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d   The  x>=y  term
24f00 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52   */.  Expr compR
24f10 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20  ight;   /* The  
24f20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x<=z  term */.  
24f30 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20  Expr exprX;     
24f40 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62    /* The  x  sub
24f50 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
24f60 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
24f70 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75  ; /* Temporary u
24f80 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a  se register */..
24f90 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c  .  memset(&compL
24fa0 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  eft, 0, sizeof(E
24fb0 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  xpr));.  memset(
24fc0 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73  &compRight, 0, s
24fd0 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
24fe0 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c  memset(&exprAnd,
24ff0 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
25000 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45  );..  assert( !E
25010 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
25020 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
25030 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d  ct) );.  exprX =
25040 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a   *pExpr->pLeft;.
25050 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54    exprAnd.op = T
25060 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64  K_AND;.  exprAnd
25070 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65  .pLeft = &compLe
25080 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52  ft;.  exprAnd.pR
25090 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68  ight = &compRigh
250a0 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70  t;.  compLeft.op
250b0 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70   = TK_GE;.  comp
250c0 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  Left.pLeft = &ex
250d0 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  prX;.  compLeft.
250e0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
250f0 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
25100 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  xpr;.  compRight
25110 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63  .op = TK_LE;.  c
25120 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d  ompRight.pLeft =
25130 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52   &exprX;.  compR
25140 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45  ight.pRight = pE
25150 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
25160 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72  1].pExpr;.  expr
25170 54 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72  ToRegister(&expr
25180 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  X, exprCodeVecto
25190 72 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  r(pParse, &exprX
251a0 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
251b0 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20   if( xJump ){.  
251c0 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20    xJump(pParse, 
251d0 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
251e0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
251f0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 72  else{.    /* Mar
25200 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  k the expression
25210 20 69 73 20 62 65 69 6e 67 20 66 72 6f 6d 20 74   is being from t
25220 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
25230 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a  lause of a join.
25240 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74      ** so that t
25250 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  he sqlite3ExprCo
25260 64 65 54 61 72 67 65 74 28 29 20 72 6f 75 74 69  deTarget() routi
25270 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  ne will not atte
25280 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20  mpt to move.    
25290 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20 50  ** it into the P
252a0 61 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72 20  arse.pConstExpr 
252b0 6c 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c 64  list.  We should
252c0 20 75 73 65 20 61 20 6e 65 77 20 62 69 74 20 66   use a new bit f
252d0 6f 72 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a 20  or this,.    ** 
252e0 66 6f 72 20 63 6c 61 72 69 74 79 2c 20 62 75 74  for clarity, but
252f0 20 77 65 20 61 72 65 20 6f 75 74 20 6f 66 20 62   we are out of b
25300 69 74 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e  its in the Expr.
25310 66 6c 61 67 73 20 66 69 65 6c 64 20 73 6f 20 77  flags field so w
25320 65 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f  e.    ** have to
25330 20 72 65 75 73 65 20 74 68 65 20 45 50 5f 46 72   reuse the EP_Fr
25340 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d  omJoin bit.  Bum
25350 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70 72  mer. */.    expr
25360 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72  X.flags |= EP_Fr
25370 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69  omJoin;.    sqli
25380 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
25390 74 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  t(pParse, &exprA
253a0 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20  nd, dest);.  }. 
253b0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
253c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
253d0 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20  egFree1);..  /* 
253e0 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20  Ensure adequate 
253f0 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f  test coverage */
25400 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
25410 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
25420 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
25430 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
25440 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
25450 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
25460 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
25470 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
25480 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
25490 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
254a0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
254b0 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
254c0 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
254d0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
254e0 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
254f0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
25500 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21    && jumpIfNull!
25510 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
25520 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
25530 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
25540 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
25550 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
25560 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
25570 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
25580 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
25590 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
255a0 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
255b0 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
255c0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
255d0 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
255e0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
255f0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
25600 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
25610 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
25620 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
25630 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
25640 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
25650 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b  ase( xJump==0 );
25660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
25670 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
25680 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
25690 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
256a0 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
256b0 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
256c0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
256d0 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
256e0 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
256f0 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
25700 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
25710 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
25720 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
25730 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
25740 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
25750 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
25760 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
25770 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
25780 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
25790 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
257a0 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FNULL..**.** Thi
257b0 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
257c0 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
257d0 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
257e0 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
257f0 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
25800 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
25810 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
25820 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
25830 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
25840 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
25850 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
25860 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
25870 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
25880 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
25890 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
258a0 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
258b0 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
258c0 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
258d0 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
258e0 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
258f0 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
25900 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
25910 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
25920 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
25930 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
25940 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
25950 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
25960 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
25970 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
25980 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
25990 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
259a0 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
259b0 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
259c0 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
259d0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
259e0 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
259f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
25a00 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65  R(v==0) )     re
25a10 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65  turn;  /* Existe
25a20 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
25a30 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
25a40 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
25a50 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  pr==0) ) return;
25a60 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73    /* No way this
25a70 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20   can happen */. 
25a80 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
25a90 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
25aa0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
25ab0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
25ac0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
25ad0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
25ae0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
25af0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
25b00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
25b10 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
25b20 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a  xpr->pLeft, d2,j
25b30 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
25b40 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
25b50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25b60 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
25b70 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
25b80 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
25b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25ba0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
25bb0 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61   d2);.      brea
25bc0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
25bd0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
25be0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
25bf0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
25c00 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
25c10 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
25c20 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
25c30 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
25c40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
25c50 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
25c60 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
25c70 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
25c80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25c90 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
25ca0 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
25cb0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
25cc0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
25cd0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
25ce0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
25cf0 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
25d00 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
25d10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
25d20 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a  ase TK_TRUTH: {.
25d30 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b        int isNot;
25d40 20 20 20 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20        /* IS NOT 
25d50 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46  TRUE or IS NOT F
25d60 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ALSE */.      in
25d70 74 20 69 73 54 72 75 65 3b 20 20 20 20 20 2f 2a  t isTrue;     /*
25d80 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e   IS TRUE or IS N
25d90 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20  OT TRUE */.     
25da0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
25db0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
25dc0 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d    isNot = pExpr-
25dd0 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a  >op2==TK_ISNOT;.
25de0 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73        isTrue = s
25df0 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56  qlite3ExprTruthV
25e00 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67  alue(pExpr->pRig
25e10 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ht);.      testc
25e20 61 73 65 28 20 69 73 54 72 75 65 20 26 26 20 69  ase( isTrue && i
25e30 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65  sNot );.      te
25e40 73 74 63 61 73 65 28 20 21 69 73 54 72 75 65 20  stcase( !isTrue 
25e50 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20  && isNot );.    
25e60 20 20 69 66 28 20 69 73 54 72 75 65 20 5e 20 69    if( isTrue ^ i
25e70 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  sNot ){.        
25e80 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
25e90 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
25ea0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20  >pLeft, dest,.  
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ec0 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
25ed0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
25ee0 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  L : 0);.      }e
25ef0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
25f00 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
25f10 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
25f20 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20  Left, dest,.    
25f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f40 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53         isNot ? S
25f50 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
25f60 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20   : 0);.      }. 
25f70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25f80 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
25f90 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
25fa0 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63  NOT:.      testc
25fb0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
25fc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
25fd0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
25fe0 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
25ff0 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
26000 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
26010 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c  jumpIfNull = SQL
26020 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
26030 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
26040 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
26050 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
26060 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
26070 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
26080 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
26090 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
260a0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
260b0 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
260c0 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  r(pExpr->pLeft) 
260d0 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65  ) goto default_e
260e0 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63  xpr;.      testc
260f0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
26100 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
26110 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
26120 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
26130 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
26140 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
26150 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
26160 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
26170 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
26180 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
26190 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
261a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
261b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
261c0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
261d0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
261e0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
261f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
26200 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
26210 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
26220 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
26230 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
26240 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
26250 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
26260 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
26270 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26280 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
26290 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
262a0 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
262b0 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
262c0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
262d0 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
262e0 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
262f0 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
26300 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
26310 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
26320 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Ge);.      a
26330 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
26340 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
26350 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
26360 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26370 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
26380 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
26390 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
263a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
263b0 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
263c0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
263d0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
263e0 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
263f0 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
26400 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  (op==OP_Ne);.   
26410 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
26420 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
26430 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
26440 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
26450 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
26460 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
26470 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
26480 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
26490 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
264a0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
264b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
264c0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
264d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
264e0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
264f0 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
26500 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
26510 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
26520 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
26530 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
26540 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
26550 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
26560 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
26570 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20  ll ); testcase( 
26580 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
26590 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
265a0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
265b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
265c0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
265d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
265e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
265f0 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
26600 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
26610 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  f(v, op==TK_ISNU
26620 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LL);.      VdbeC
26630 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26640 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
26650 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
26660 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
26670 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
26680 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
26690 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
266a0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
266b0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
266c0 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
266d0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
266e0 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  t, sqlite3ExprIf
266f0 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  True, jumpIfNull
26700 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
26710 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
26720 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
26730 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  RY.    case TK_I
26740 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
26750 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
26760 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
26770 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
26780 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d  destIfNull = jum
26790 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a  pIfNull ? dest :
267a0 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20   destIfFalse;.  
267b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
267c0 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
267d0 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
267e0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
267f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26800 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
26810 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26820 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
26830 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
26840 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26850 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
26860 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75  ult: {.    defau
26870 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20 20 69  lt_expr:.      i
26880 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  f( exprAlwaysTru
26890 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
268a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
268b0 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20  oto(v, dest);.  
268c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78      }else if( ex
268d0 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
268e0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
268f0 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* No-op */.    
26900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26910 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
26920 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
26930 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
26940 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e1);.        sql
26950 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
26960 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73  , OP_If, r1, des
26970 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
26980 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
26990 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
269a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
269b0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
269c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
269d0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
269e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
269f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
26a00 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
26a10 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
26a20 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
26a30 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
26a40 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
26a50 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e2);  .}../*.** 
26a60 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
26a70 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
26a80 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
26a90 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
26aa0 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
26ab0 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
26ac0 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
26ad0 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
26ae0 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
26af0 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
26b00 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
26b10 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
26b20 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
26b30 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
26b40 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
26b50 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a  r false) then.**
26b60 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e   jump if jumpIfN
26b70 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  ull is SQLITE_JU
26b80 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c  MPIFNULL or fall
26b90 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
26ba0 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a  IfNull.** is 0..
26bb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
26bc0 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65  xprIfFalse(Parse
26bd0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
26be0 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
26bf0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
26c00 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
26c10 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
26c20 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
26c30 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
26c40 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
26c50 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
26c60 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
26c70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
26c80 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
26c90 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26ca0 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
26cb0 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69  ) return; /* Exi
26cc0 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
26cd0 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
26ce0 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d   */.  if( pExpr=
26cf0 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a  =0 )    return;.
26d00 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
26d10 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
26d20 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
26d30 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
26d40 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
26d50 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
26d60 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
26d70 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
26d80 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
26d90 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
26da0 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
26db0 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
26dc0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
26dd0 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
26de0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
26df0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
26e00 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
26e10 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
26e20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
26e30 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
26e40 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
26e50 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
26e60 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
26e70 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
26e80 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
26e90 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
26ea0 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
26eb0 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
26ec0 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
26ed0 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
26ee0 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
26ef0 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
26f00 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
26f10 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
26f20 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
26f30 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
26f40 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
26f50 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
26f60 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
26f70 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
26f80 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
26f90 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
26fa0 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
26fb0 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
26fc0 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
26fd0 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
26fe0 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
26ff0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
27000 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
27010 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
27020 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
27030 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27040 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
27050 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
27060 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
27070 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
27080 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
27090 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
270a0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
270b0 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
270c0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
270d0 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
270e0 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
270f0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
27100 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
27110 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
27120 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
27130 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
27140 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
27150 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
27160 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
27170 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
27180 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
27190 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
271a0 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
271b0 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
271c0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
271d0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
271e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
271f0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
27200 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
27210 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
27220 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
27230 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
27240 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
27250 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
27260 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
27270 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
27280 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
27290 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
272a0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
272b0 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
272c0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
272d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
272e0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
272f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27300 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75  ft, d2, jumpIfNu
27310 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
27320 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
27330 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
27340 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27350 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
27360 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27370 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
27380 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
27390 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
273a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
273b0 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
273c0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
273d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
273e0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
273f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27400 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
27410 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
27420 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
27430 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a  ase TK_TRUTH: {.
27440 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b        int isNot;
27450 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55     /* IS NOT TRU
27460 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c 53  E or IS NOT FALS
27470 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  E */.      int i
27480 73 54 72 75 65 3b 20 20 2f 2a 20 49 53 20 54 52  sTrue;  /* IS TR
27490 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55  UE or IS NOT TRU
274a0 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  E */.      testc
274b0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
274c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f  =0 );.      isNo
274d0 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d  t = pExpr->op2==
274e0 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20  TK_ISNOT;.      
274f0 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33  isTrue = sqlite3
27500 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70  ExprTruthValue(p
27510 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
27520 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
27530 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29  sTrue && isNot )
27540 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27550 28 20 21 69 73 54 72 75 65 20 26 26 20 69 73 4e  ( !isTrue && isN
27560 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ot );.      if( 
27570 69 73 54 72 75 65 20 5e 20 69 73 4e 6f 74 20 29  isTrue ^ isNot )
27580 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20  {.        /* IS 
27590 54 52 55 45 20 61 6e 64 20 49 53 20 4e 4f 54 20  TRUE and IS NOT 
275a0 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 20  FALSE */.       
275b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
275c0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
275d0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a  r->pLeft, dest,.
275e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275f0 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
27600 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55   ? 0 : SQLITE_JU
27610 4d 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  MPIFNULL);..    
27620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27630 20 2f 2a 20 49 53 20 46 41 4c 53 45 20 61 6e 64   /* IS FALSE and
27640 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a   IS NOT TRUE */.
27650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
27660 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
27670 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
27680 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  dest,.          
27690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276a0 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49  isNot ? 0 : SQLI
276b0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
276c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
276d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
276e0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
276f0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
27700 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
27710 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
27720 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27730 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
27740 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f  ISNOT );.      o
27750 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  p = (pExpr->op==
27760 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a  TK_IS) ? TK_NE :
27770 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75   TK_EQ;.      ju
27780 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54  mpIfNull = SQLIT
27790 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
277a0 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
277b0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
277c0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
277d0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
277e0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
277f0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
27800 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
27810 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
27820 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
27830 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20  pExpr->pLeft) ) 
27840 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70  goto default_exp
27850 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  r;.      testcas
27860 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27870 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
27880 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
27890 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
278a0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
278b0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
278c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
278d0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
278e0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
278f0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
27900 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
27910 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
27920 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
27930 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27940 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
27950 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27960 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
27970 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
27980 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
27990 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
279a0 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
279b0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
279c0 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
279d0 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
279e0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
279f0 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
27a00 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
27a10 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
27a20 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
27a30 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
27a40 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
27a50 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
27a60 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
27a70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
27a80 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
27a90 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
27aa0 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
27ab0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
27ac0 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64  OP_Eq);.      Vd
27ad0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27ae0 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
27af0 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
27b00 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
27b10 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27b20 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
27b30 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
27b40 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
27b50 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
27b60 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
27b70 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
27b80 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27b90 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
27ba0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
27bb0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
27bc0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27bd0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
27be0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
27bf0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
27c00 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
27c10 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
27c20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27c30 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
27c40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27c50 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
27c60 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
27c70 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72  TNULL: {.      r
27c80 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
27c90 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
27ca0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
27cb0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
27cc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27cd0 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
27ce0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
27cf0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
27d00 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72  L );   VdbeCover
27d10 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
27d20 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  ISNULL);.      t
27d30 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
27d40 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65  NOTNULL );  Vdbe
27d50 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
27d60 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
27d70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
27d80 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
27d90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
27da0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
27db0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
27dc0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27dd0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
27de0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
27df0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
27e00 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49  st, sqlite3ExprI
27e10 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75  fFalse, jumpIfNu
27e20 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
27e30 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
27e40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
27e50 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
27e60 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _IN: {.      if(
27e70 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20   jumpIfNull ){. 
27e80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
27e90 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
27ea0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
27eb0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
27ec0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65  {.        int de
27ed0 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
27ee0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
27ef0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
27f00 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
27f10 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
27f20 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  t, destIfNull);.
27f30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27f40 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
27f50 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
27f60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
27f70 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
27f80 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
27f90 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70  .    default_exp
27fa0 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65 78  r: .      if( ex
27fb0 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
27fc0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
27fd0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
27fe0 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
27ff0 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
28000 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
28010 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  ){.        /* no
28020 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
28030 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
28040 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28050 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
28060 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
28070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28080 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
28090 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
280a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
280b0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
280c0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
280d0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
280e0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
280f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28100 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28110 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
28120 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
28130 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
28140 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
28150 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
28160 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
28170 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
28180 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65  );.}../*.** Like
28190 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
281a0 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61  lse() except tha
281b0 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65  t a copy is made
281c0 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65   of pExpr before
281d0 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74  .** code generat
281e0 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f  ion, and that co
281f0 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66  py is deleted af
28200 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ter code generat
28210 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73  ion. This.** ens
28220 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72  ures that the or
28230 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20  iginal pExpr is 
28240 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
28250 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
28260 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a  FalseDup(Parse *
28270 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
28280 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e  xpr, int dest,in
28290 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
282a0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
282b0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
282c0 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74  r *pCopy = sqlit
282d0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
282e0 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  xpr, 0);.  if( d
282f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
28300 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
28310 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
28320 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74  rse, pCopy, dest
28330 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
28340 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
28350 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79  Delete(db, pCopy
28360 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72  );.}../*.** Expr
28370 65 73 73 69 6f 6e 20 70 56 61 72 20 69 73 20 67  ession pVar is g
28380 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
28390 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 2e  an SQL variable.
283a0 20 70 45 78 70 72 20 6d 61 79 20 62 65 20 61 6e   pExpr may be an
283b0 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65 78 70  y.** type of exp
283c0 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ression..**.** I
283d0 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d  f pExpr is a sim
283e0 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 2d 20  ple SQL value - 
283f0 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c  an integer, real
28400 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a  , string, blob.*
28410 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65 20  * or NULL value 
28420 2d 20 74 68 65 6e 20 74 68 65 20 56 44 42 45 20  - then the VDBE 
28430 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
28440 70 72 65 70 61 72 65 64 20 69 73 20 63 6f 6e 66  prepared is conf
28450 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72 65 2d  igured.** to re-
28460 70 72 65 70 61 72 65 20 65 61 63 68 20 74 69 6d  prepare each tim
28470 65 20 61 20 6e 65 77 20 76 61 6c 75 65 20 69 73  e a new value is
28480 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62   bound to variab
28490 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41  le pVar..**.** A
284a0 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20  dditionally, if 
284b0 70 45 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c  pExpr is a simpl
284c0 65 20 53 51 4c 20 76 61 6c 75 65 20 61 6e 64 20  e SQL value and 
284d0 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 68 65  the value is the
284e0 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68 61 74  .** same as that
284f0 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75 6e 64   currently bound
28500 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61   to variable pVa
28510 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  r, non-zero is r
28520 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65  eturned..** Othe
28530 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 76 61  rwise, if the va
28540 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 74 68 65  lues are not the
28550 20 73 61 6d 65 20 6f 72 20 69 66 20 70 45 78 70   same or if pExp
28560 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c  r is not a simpl
28570 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65 2c 20  e.** SQL value, 
28580 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
28590 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
285a0 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61  exprCompareVaria
285b0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
285c0 65 2c 20 45 78 70 72 20 2a 70 56 61 72 2c 20 45  e, Expr *pVar, E
285d0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
285e0 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 6e  nt res = 0;.  in
285f0 74 20 69 56 61 72 3b 0a 20 20 73 71 6c 69 74 65  t iVar;.  sqlite
28600 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a 70 52  3_value *pL, *pR
28610 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c 69 74   = 0;.  .  sqlit
28620 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
28630 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
28640 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  r, SQLITE_UTF8, 
28650 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c  SQLITE_AFF_BLOB,
28660 20 26 70 52 29 3b 0a 20 20 69 66 28 20 70 52 20   &pR);.  if( pR 
28670 29 7b 0a 20 20 20 20 69 56 61 72 20 3d 20 70 56  ){.    iVar = pV
28680 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ar->iColumn;.   
28690 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
286a0 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70  armask(pParse->p
286b0 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20  Vdbe, iVar);.   
286c0 20 70 4c 20 3d 20 73 71 6c 69 74 65 33 56 64 62   pL = sqlite3Vdb
286d0 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70  eGetBoundValue(p
286e0 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
286f0 65 2c 20 69 56 61 72 2c 20 53 51 4c 49 54 45 5f  e, iVar, SQLITE_
28700 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20 20 69  AFF_BLOB);.    i
28710 66 28 20 70 4c 20 29 7b 0a 20 20 20 20 20 20 69  f( pL ){.      i
28720 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
28730 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c 49 54  _type(pL)==SQLIT
28740 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
28750 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
28760 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b  text(pL); /* Mak
28770 65 20 73 75 72 65 20 74 68 65 20 65 6e 63 6f 64  e sure the encod
28780 69 6e 67 20 69 73 20 55 54 46 2d 38 20 2a 2f 0a  ing is UTF-8 */.
28790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
287a0 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65 33 4d  s =  0==sqlite3M
287b0 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20 70 52  emCompare(pL, pR
287c0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
287d0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
287e0 28 70 52 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (pR);.    sqlite
287f0 33 56 61 6c 75 65 46 72 65 65 28 70 4c 29 3b 0a  3ValueFree(pL);.
28800 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65    }..  return re
28810 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  s;.}../*.** Do a
28820 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
28830 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
28840 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
28850 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
28860 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
28870 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
28880 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
28890 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
288a0 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
288b0 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
288c0 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
288d0 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
288e0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
288f0 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
28900 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
28910 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
28920 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
28930 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
28940 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
28950 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
28960 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
28970 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
28980 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
28990 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
289a0 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
289b0 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41  ab..**.** The pA
289c0 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75   side might be u
289d0 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
289e0 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
289f0 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73  e case and pB is
28a00 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b  .** not using TK
28a10 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73  _REGISTER but is
28a20 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76   otherwise equiv
28a30 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c  alent, then stil
28a40 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  l return 0..**.*
28a50 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
28a60 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
28a70 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
28a80 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
28a90 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
28aa0 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
28ab0 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
28ac0 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
28ad0 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
28ae0 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
28af0 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
28b00 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
28b10 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
28b20 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
28b30 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
28b40 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
28b50 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
28b60 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
28b70 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
28b80 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
28b90 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
28ba0 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
28bb0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
28bc0 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
28bd0 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
28be0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
28bf0 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
28c00 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
28c10 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
28c20 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
28c30 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
28c40 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
28c50 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
28c60 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
28c70 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
28c80 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
28c90 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  alfunction..**.*
28ca0 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e  * If pParse is n
28cb0 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54 4b 5f  ot NULL then TK_
28cc0 56 41 52 49 41 42 4c 45 20 74 65 72 6d 73 20 69  VARIABLE terms i
28cd0 6e 20 70 41 20 77 69 74 68 20 62 69 6e 64 69 6e  n pA with bindin
28ce0 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  gs in.** pParse-
28cf0 3e 70 52 65 70 72 65 70 61 72 65 20 63 61 6e 20  >pReprepare can 
28d00 62 65 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e  be matched again
28d10 73 74 20 6c 69 74 65 72 61 6c 73 20 69 6e 20 70  st literals in p
28d20 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50 61 72  B.  The .** pPar
28d30 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61  se->pVdbe->expma
28d40 73 6b 20 62 69 74 6d 61 73 6b 20 69 73 20 75 70  sk bitmask is up
28d50 64 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 76  dated for each v
28d60 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63  ariable referenc
28d70 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72 73 65  ed..** If pParse
28d80 20 69 73 20 4e 55 4c 4c 20 28 74 68 65 20 6e 6f   is NULL (the no
28d90 72 6d 61 6c 20 63 61 73 65 29 20 74 68 65 6e 20  rmal case) then 
28da0 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c 45 20  any TK_VARIABLE 
28db0 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72 67 75  term in .** Argu
28dc0 6d 65 6e 74 20 70 50 61 72 73 65 20 73 68 6f 75  ment pParse shou
28dd0 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 4e  ld normally be N
28de0 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ULL. If it is no
28df0 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20 6f 72  t NULL and pA or
28e00 0a 2a 2a 20 70 42 20 63 61 75 73 65 73 20 61 20  .** pB causes a 
28e10 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
28e20 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  2..*/.int sqlite
28e30 33 45 78 70 72 43 6f 6d 70 61 72 65 28 50 61 72  3ExprCompare(Par
28e40 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
28e50 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20   *pA, Expr *pB, 
28e60 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32  int iTab){.  u32
28e70 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a   combinedFlags;.
28e80 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
28e90 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  B==0 ){.    retu
28ea0 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20  rn pB==pA ? 0 : 
28eb0 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  2;.  }.  if( pPa
28ec0 72 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d 3d 54  rse && pA->op==T
28ed0 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20 65 78  K_VARIABLE && ex
28ee0 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c  prCompareVariabl
28ef0 65 28 70 50 61 72 73 65 2c 20 70 41 2c 20 70 42  e(pParse, pA, pB
28f00 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
28f10 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65  0;.  }.  combine
28f20 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61  dFlags = pA->fla
28f30 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a  gs | pB->flags;.
28f40 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c    if( combinedFl
28f50 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
28f60 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41  e ){.    if( (pA
28f70 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67  ->flags&pB->flag
28f80 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  s&EP_IntValue)!=
28f90 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75  0 && pA->u.iValu
28fa0 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20  e==pB->u.iValue 
28fb0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
28fc0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  0;.    }.    ret
28fd0 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
28fe0 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20   pA->op!=pB->op 
28ff0 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
29000 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
29010 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
29020 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e  are(pParse, pA->
29030 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c 32  pLeft,pB,iTab)<2
29040 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29050 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
29060 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pB->op==TK_COL
29070 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
29080 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
29090 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74 2c  e, pA,pB->pLeft,
290a0 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
290b0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
290c0 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
290d0 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
290e0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
290f0 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
29100 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f  UMN && pA->u.zTo
29110 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ken ){.    if( p
29120 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  A->op==TK_FUNCTI
29130 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ON ){.      if( 
29140 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
29150 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
29160 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72  u.zToken)!=0 ) r
29170 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c  eturn 2;.    }el
29180 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54  se if( pA->op==T
29190 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20  K_COLLATE ){.   
291a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
291b0 74 72 69 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  tricmp(pA->u.zTo
291c0 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
291d0 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b  )!=0 ) return 2;
291e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
291f0 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b  trcmp(pA->u.zTok
29200 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  en,pB->u.zToken)
29210 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
29220 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
29230 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
29240 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
29250 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
29260 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
29270 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c  turn 2;.  if( AL
29280 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c  WAYS((combinedFl
29290 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ags & EP_TokenOn
292a0 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69  ly)==0) ){.    i
292b0 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
292c0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
292d0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
292e0 69 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61  if( (combinedFla
292f0 67 73 20 26 20 45 50 5f 46 69 78 65 64 43 6f 6c  gs & EP_FixedCol
29300 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c  )==0.     && sql
29310 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
29320 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66  pParse, pA->pLef
29330 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  t, pB->pLeft, iT
29340 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
29350 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
29360 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
29370 65 2c 20 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  e, pA->pRight, p
29380 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29  B->pRight, iTab)
29390 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
293a0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
293b0 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ListCompare(pA->
293c0 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70  x.pList, pB->x.p
293d0 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20 72 65  List, iTab) ) re
293e0 74 75 72 6e 20 32 3b 0a 20 20 20 20 61 73 73 65  turn 2;.    asse
293f0 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61  rt( (combinedFla
29400 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64 29  gs & EP_Reduced)
29410 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
29420 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47  A->op!=TK_STRING
29430 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 54   && pA->op!=TK_T
29440 52 55 45 46 41 4c 53 45 20 29 7b 0a 20 20 20 20  RUEFALSE ){.    
29450 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d    if( pA->iColum
29460 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29  n!=pB->iColumn )
29470 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20   return 2;.     
29480 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21   if( pA->iTable!
29490 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20  =pB->iTable .   
294a0 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61 62      && (pA->iTab
294b0 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45  le!=iTab || NEVE
294c0 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29  R(pB->iTable>=0)
294d0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
294e0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
294f0 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
29500 4e 43 0a 20 20 20 20 2f 2a 20 4a 75 73 74 69 66  NC.    /* Justif
29510 69 63 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ication for the 
29520 61 73 73 65 72 74 28 29 3a 0a 20 20 20 20 2a 2a  assert():.    **
29530 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
29540 73 20 68 61 76 65 20 70 2d 3e 6f 70 3d 3d 54 4b  s have p->op==TK
29550 5f 46 55 4e 43 54 49 4f 4e 20 62 75 74 20 61 67  _FUNCTION but ag
29560 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
29570 73 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 70 2d  s.    ** have p-
29580 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
29590 54 49 4f 4e 2e 20 20 53 6f 20 61 6e 79 20 63 6f  TION.  So any co
295a0 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e  mparison between
295b0 20 61 6e 20 61 67 67 72 65 67 61 74 65 0a 20 20   an aggregate.  
295c0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6e    ** function an
295d0 64 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  d a window funct
295e0 69 6f 6e 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ion should have 
295f0 66 61 69 6c 65 64 20 62 65 66 6f 72 65 20 72 65  failed before re
29600 61 63 68 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aching.    ** th
29610 69 73 20 70 6f 69 6e 74 2e 20 20 41 6e 64 2c 20  is point.  And, 
29620 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
29630 6c 65 20 74 6f 20 68 61 76 65 20 61 20 77 69 6e  le to have a win
29640 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  dow function and
29650 0a 20 20 20 20 2a 2a 20 61 20 73 63 61 6c 61 72  .    ** a scalar
29660 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
29670 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 6e 64  he same name and
29680 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
29690 65 6e 74 73 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  ents.  So.    **
296a0 20 69 66 20 77 65 20 72 65 61 63 68 20 74 68 69   if we reach thi
296b0 73 20 70 6f 69 6e 74 2c 20 65 69 74 68 65 72 20  s point, either 
296c0 41 20 61 6e 64 20 42 20 62 6f 74 68 20 77 69 6e  A and B both win
296d0 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  dow functions or
296e0 0a 20 20 20 20 2a 2a 20 6e 65 69 74 68 65 72 20  .    ** neither 
296f0 61 72 65 20 61 20 77 69 6e 64 6f 77 20 66 75 6e  are a window fun
29700 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 61  ctions. */.    a
29710 73 73 65 72 74 28 20 28 70 41 2d 3e 70 57 69 6e  ssert( (pA->pWin
29720 3d 3d 30 29 3d 3d 28 70 42 2d 3e 70 57 69 6e 3d  ==0)==(pB->pWin=
29730 3d 30 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  =0) );..    if( 
29740 70 41 2d 3e 70 57 69 6e 21 3d 30 20 29 7b 0a 20  pA->pWin!=0 ){. 
29750 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29760 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 70 50  WindowCompare(pP
29770 61 72 73 65 2c 70 41 2d 3e 70 57 69 6e 2c 70 42  arse,pA->pWin,pB
29780 2d 3e 70 57 69 6e 29 21 3d 30 20 29 20 72 65 74  ->pWin)!=0 ) ret
29790 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 23 65 6e  urn 2;.    }.#en
297a0 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
297b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   0;.}../*.** Com
297c0 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73  pare two ExprLis
297d0 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75  t objects.  Retu
297e0 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72 65  rn 0 if they are
297f0 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a   identical and .
29800 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ** non-zero if t
29810 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e  hey differ in an
29820 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  y way..**.** If 
29830 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f  any subelement o
29840 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54  f pB has Expr.iT
29850 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20  able==(-1) then 
29860 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  it is allowed.**
29870 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61   to compare equa
29880 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65  l to an equivale
29890 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41  nt element in pA
298a0 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c   with Expr.iTabl
298b0 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54  e==iTab..**.** T
298c0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
298d0 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  t return non-zer
298e0 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74  o for equivalent
298f0 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65   ExprLists.  The
29900 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75  .** only consequ
29910 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73  ence will be dis
29920 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69  abled optimizati
29930 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20 72  ons.  But this r
29940 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e  outine.** must n
29950 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69 66  ever return 0 if
29960 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73   the two ExprLis
29970 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69  t objects are di
29980 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61  fferent, or.** a
29990 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c   malfunction wil
299a0 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  l result..**.** 
299b0 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  Two NULL pointer
299c0 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
299d0 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e   to be the same.
299e0 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69    But a NULL poi
299f0 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64  nter.** always d
29a00 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f  iffers from a no
29a10 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  n-NULL pointer..
29a20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
29a30 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78  prListCompare(Ex
29a40 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72  prList *pA, Expr
29a50 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54  List *pB, int iT
29a60 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ab){.  int i;.  
29a70 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d  if( pA==0 && pB=
29a80 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
29a90 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42   if( pA==0 || pB
29aa0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
29ab0 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21    if( pA->nExpr!
29ac0 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  =pB->nExpr ) ret
29ad0 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 1;.  for(i=0
29ae0 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69  ; i<pA->nExpr; i
29af0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
29b00 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d  ExprA = pA->a[i]
29b10 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  .pExpr;.    Expr
29b20 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61   *pExprB = pB->a
29b30 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
29b40 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74  f( pA->a[i].sort
29b50 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e  Order!=pB->a[i].
29b60 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75  sortOrder ) retu
29b70 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 1;.    if( sq
29b80 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
29b90 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45 78 70  (0, pExprA, pExp
29ba0 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  rB, iTab) ) retu
29bb0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
29bc0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn 0;.}../*.** L
29bd0 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  ike sqlite3ExprC
29be0 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74 20  ompare() except 
29bf0 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
29c00 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65 76  s at the top-lev
29c10 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72 65  el.** are ignore
29c20 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
29c30 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69 70  3ExprCompareSkip
29c40 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
29c50 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
29c60 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
29c70 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a 20  ExprCompare(0,. 
29c80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
29c90 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
29ca0 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20 20 20  te(pA),.        
29cb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
29cc0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42 29 2c  SkipCollate(pB),
29cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54  .             iT
29ce0 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ab);.}../*.** Re
29cf0 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20  turn true if we 
29d00 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70 45  can prove the pE
29d10 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  2 will always be
29d20 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73 0a   true if pE1 is.
29d30 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e  ** true.  Return
29d40 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61 6e   false if we can
29d50 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68 65  not complete the
29d60 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45 32   proof or if pE2
29d70 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c   might.** be fal
29d80 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  se.  Examples:.*
29d90 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d  *.**     pE1: x=
29da0 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  =5       pE2: x=
29db0 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
29dc0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
29dd0 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20 20     pE1: x>0     
29de0 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
29df0 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
29e00 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
29e10 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70 45  1: x=21       pE
29e20 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33 20  2: x=21 OR y=43 
29e30 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
29e40 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
29e50 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20 49  123     pE2: x I
29e60 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
29e70 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
29e80 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20 20    pE1: x!=?1    
29e90 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
29ea0 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
29eb0 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
29ec0 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a   x IS NULL  pE2:
29ed0 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
29ee0 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
29ef0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53  **     pE1: x IS
29f00 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49 53   ?2    pE2: x IS
29f10 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 75   NOT NULL    Reu
29f20 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a  slt: false.**.**
29f30 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20   When comparing 
29f40 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
29f50 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64 20  between pE1 and 
29f60 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73 0a  pE2, if pE2 has.
29f70 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c 30  ** Expr.iTable<0
29f80 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20 74   then assume a t
29f90 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76 65  able number give
29fa0 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  n by iTab..**.**
29fb0 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e 6f   If pParse is no
29fc0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
29fd0 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e 64   values of bound
29fe0 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 70 45   variables in pE
29ff0 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 70 61 72  1 are .** compar
2a000 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65 72  ed against liter
2a010 61 6c 20 76 61 6c 75 65 73 20 69 6e 20 70 45 32  al values in pE2
2a020 20 61 6e 64 20 70 50 61 72 73 65 2d 3e 70 56 64   and pParse->pVd
2a030 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69 73 0a 2a  be->expmask is.*
2a040 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 72 65  * modified to re
2a050 63 6f 72 64 20 77 68 69 63 68 20 62 6f 75 6e 64  cord which bound
2a060 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 72   variables are r
2a070 65 66 65 72 65 6e 63 65 64 2e 20 20 49 66 20 70  eferenced.  If p
2a080 50 61 72 73 65 20 0a 2a 2a 20 69 73 20 4e 55 4c  Parse .** is NUL
2a090 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65 20 77 69  L, then false wi
2a0a0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 69  ll be returned i
2a0b0 66 20 70 45 31 20 63 6f 6e 74 61 69 6e 73 20 61  f pE1 contains a
2a0c0 6e 79 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c  ny bound variabl
2a0d0 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69  es..**.** When i
2a0e0 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20  n doubt, return 
2a0f0 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e  false.  Returnin
2a100 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76  g true might giv
2a110 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  e a performance.
2a120 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20  ** improvement. 
2a130 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65   Returning false
2a140 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70   might cause a p
2a150 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
2a160 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20  tion, but.** it 
2a170 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65  will always give
2a180 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
2a190 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65  wer and is hence
2a1a0 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f   always safe..*/
2a1b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2a1c0 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61 72 73  ImpliesExpr(Pars
2a1d0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
2a1e0 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c  *pE1, Expr *pE2,
2a1f0 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66   int iTab){.  if
2a200 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2a210 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 31  pare(pParse, pE1
2a220 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30 20  , pE2, iTab)==0 
2a230 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
2a240 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e  .  }.  if( pE2->
2a250 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20  op==TK_OR.   && 
2a260 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c  (sqlite3ExprImpl
2a270 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c 20  iesExpr(pParse, 
2a280 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c  pE1, pE2->pLeft,
2a290 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20   iTab).         
2a2a0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78      || sqlite3Ex
2a2b0 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50  prImpliesExpr(pP
2a2c0 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e  arse, pE1, pE2->
2a2d0 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 0a  pRight, iTab) ).
2a2e0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2a2f0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32  1;.  }.  if( pE2
2a300 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
2a310 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f   && pE1->op!=TK_
2a320 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f  ISNULL && pE1->o
2a330 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20 20  p!=TK_IS ){.    
2a340 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c 69 74  Expr *pX = sqlit
2a350 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
2a360 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a 20  e(pE1->pLeft);. 
2a370 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 21     testcase( pX!
2a380 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  =pE1->pLeft );. 
2a390 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2a3a0 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
2a3b0 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65 66 74  , pX, pE2->pLeft
2a3c0 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65 74  , iTab)==0 ) ret
2a3d0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2a3e0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2a3f0 54 68 69 73 20 69 73 20 74 68 65 20 45 78 70 72  This is the Expr
2a400 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66   node callback f
2a410 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  or sqlite3ExprIm
2a420 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28  pliesNotNullRow(
2a430 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  )..** If the exp
2a440 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 71  ression node req
2a450 75 69 72 65 73 20 74 68 61 74 20 74 68 65 20 74  uires that the t
2a460 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65 72 2d  able at pWalker-
2a470 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20 61 20  >iCur.** have a 
2a480 6e 6f 6e 2d 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 2c  non-NULL column,
2a490 20 74 68 65 6e 20 73 65 74 20 70 57 61 6c 6b 65   then set pWalke
2a4a0 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20 61 6e  r->eCode to 1 an
2a4b0 64 20 61 62 6f 72 74 2e 0a 2a 2f 0a 73 74 61 74  d abort..*/.stat
2a4c0 69 63 20 69 6e 74 20 69 6d 70 6c 69 65 73 4e 6f  ic int impliesNo
2a4d0 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b 65 72 20  tNullRow(Walker 
2a4e0 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
2a4f0 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 69  pExpr){.  /* Thi
2a500 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
2a510 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 57 48 45  y called for WHE
2a520 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
2a530 73 69 6f 6e 73 20 61 6e 64 20 73 6f 20 69 74 0a  sions and so it.
2a540 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 68 61 76 65    ** cannot have
2a550 20 61 6e 79 20 54 4b 5f 41 47 47 5f 43 4f 4c 55   any TK_AGG_COLU
2a560 4d 4e 20 65 6e 74 72 69 65 73 20 62 65 63 61 75  MN entries becau
2a570 73 65 20 74 68 6f 73 65 20 61 72 65 20 6f 6e 6c  se those are onl
2a580 79 20 66 6f 75 6e 64 0a 20 20 2a 2a 20 69 6e 20  y found.  ** in 
2a590 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 2e 20  HAVING clauses. 
2a5a0 20 57 65 20 63 61 6e 20 67 65 74 20 61 20 54 4b   We can get a TK
2a5b0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 69 6e  _AGG_FUNCTION in
2a5c0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c   a WHERE clause,
2a5d0 0a 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20 69  .  ** but that i
2a5e0 73 20 61 6e 20 69 6c 6c 65 67 61 6c 20 63 6f 6e  s an illegal con
2a5f0 73 74 72 75 63 74 20 61 6e 64 20 74 68 65 20 71  struct and the q
2a600 75 65 72 79 20 77 69 6c 6c 20 62 65 20 72 65 6a  uery will be rej
2a610 65 63 74 65 64 20 61 74 0a 20 20 2a 2a 20 61 20  ected at.  ** a 
2a620 6c 61 74 65 72 20 73 74 61 67 65 20 6f 66 20 70  later stage of p
2a630 72 6f 63 65 73 73 69 6e 67 2c 20 73 6f 20 74 68  rocessing, so th
2a640 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
2a650 4e 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74 0a  N case does not.
2a660 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20    ** need to be 
2a670 63 6f 6e 73 69 64 65 72 65 64 20 68 65 72 65 2e  considered here.
2a680 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45   */.  assert( pE
2a690 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
2a6a0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 74 65 73 74  COLUMN );.  test
2a6b0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2a6c0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2a6d0 20 29 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48   );..  if( ExprH
2a6e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2a6f0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
2a700 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2a710 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  e;.  switch( pEx
2a720 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
2a730 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
2a740 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a 20 20   case TK_NOT:.  
2a750 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
2a760 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
2a770 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
2a780 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  :.    case TK_CA
2a790 53 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SE:.    case TK_
2a7a0 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IN:.    case TK_
2a7b0 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
2a7c0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2a7d0 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
2a7e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2a7f0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
2a800 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OT );.      test
2a810 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2a820 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
2a830 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2a840 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
2a850 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2a860 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2a870 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OR );.      test
2a880 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2a890 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20 20 20 20  =TK_CASE );.    
2a8a0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2a8b0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  r->op==TK_IN );.
2a8c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2a8d0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55  pExpr->op==TK_FU
2a8e0 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
2a8f0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2a900 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
2a910 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  LUMN:.      if( 
2a920 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 3d  pWalker->u.iCur=
2a930 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
2a940 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  {.        pWalke
2a950 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20  r->eCode = 1;.  
2a960 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2a970 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
2a980 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2a990 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20 2f 2a 20  _Prune;..    /* 
2a9a0 56 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 61  Virtual tables a
2a9b0 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
2a9c0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6c 69  e constraints li
2a9d0 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20 53 6f 0a 20  ke x=NULL.  So. 
2a9e0 20 20 20 2a 2a 20 61 20 74 65 72 6d 20 6f 66 20     ** a term of 
2a9f0 74 68 65 20 66 6f 72 6d 20 78 3d 79 20 64 6f 65  the form x=y doe
2aa00 73 20 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  s not prove that
2aa10 20 79 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 69   y is not null i
2aa20 66 20 78 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  f x.    ** is th
2aa30 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 76 69  e column of a vi
2aa40 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
2aa50 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20     case TK_EQ:. 
2aa60 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
2aa70 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
2aa80 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
2aa90 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
2aaa0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
2aab0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2aac0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
2aad0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2aae0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2aaf0 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _NE );.      tes
2ab00 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2ab10 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==TK_LT );.     
2ab20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2ab30 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ->op==TK_LE );. 
2ab40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2ab50 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
2ab60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2ab70 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2ab80 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _GE );.      if(
2ab90 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
2aba0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
2abb0 20 49 73 56 69 72 74 75 61 6c 28 70 45 78 70 72   IsVirtual(pExpr
2abc0 2d 3e 70 4c 65 66 74 2d 3e 70 54 61 62 29 29 0a  ->pLeft->pTab)).
2abd0 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72         || (pExpr
2abe0 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
2abf0 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72  _COLUMN && IsVir
2ac00 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 52 69 67  tual(pExpr->pRig
2ac10 68 74 2d 3e 70 54 61 62 29 29 0a 20 20 20 20 20  ht->pTab)).     
2ac20 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72   ){.       retur
2ac30 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
2ac40 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
2ac50 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  :.      return W
2ac60 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
2ac70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2ac80 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29   true (non-zero)
2ac90 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   if expression p
2aca0 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75   can only be tru
2acb0 65 20 69 66 20 61 74 20 6c 65 61 73 74 0a 2a 2a  e if at least.**
2acc0 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
2acd0 61 62 6c 65 20 69 54 61 62 20 69 73 20 6e 6f 6e  able iTab is non
2ace0 2d 6e 75 6c 6c 2e 20 20 49 6e 20 6f 74 68 65 72  -null.  In other
2acf0 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 74   words, return t
2ad00 72 75 65 0a 2a 2a 20 69 66 20 65 78 70 72 65 73  rue.** if expres
2ad10 73 69 6f 6e 20 70 20 77 69 6c 6c 20 61 6c 77 61  sion p will alwa
2ad20 79 73 20 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61  ys be NULL or fa
2ad30 6c 73 65 20 69 66 20 65 76 65 72 79 20 63 6f 6c  lse if every col
2ad40 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69  umn of iTab.** i
2ad50 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61  s NULL..**.** Fa
2ad60 6c 73 65 20 6e 65 67 61 74 69 76 65 73 20 61 72  lse negatives ar
2ad70 65 20 61 63 63 65 70 74 61 62 6c 65 2e 20 20 49  e acceptable.  I
2ad80 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
2ad90 74 20 69 73 20 6f 6b 20 74 6f 20 72 65 74 75 72  t is ok to retur
2ada0 6e 0a 2a 2a 20 7a 65 72 6f 20 65 76 65 6e 20 69  n.** zero even i
2adb0 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77  f expression p w
2adc0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75  ill never be tru
2add0 65 20 6f 66 20 65 76 65 72 79 20 63 6f 6c 75 6d  e of every colum
2ade0 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20  n of iTab.** is 
2adf0 4e 55 4c 4c 2e 20 20 41 20 66 61 6c 73 65 20 6e  NULL.  A false n
2ae00 65 67 61 74 69 76 65 20 69 73 20 6d 65 72 65 6c  egative is merel
2ae10 79 20 61 20 6d 69 73 73 65 64 20 6f 70 74 69 6d  y a missed optim
2ae20 69 7a 61 74 69 6f 6e 20 6f 70 70 6f 72 74 75 6e  ization opportun
2ae30 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65  ity..**.** False
2ae40 20 70 6f 73 69 74 69 76 65 73 20 61 72 65 20 6e   positives are n
2ae50 6f 74 20 61 6c 6c 6f 77 65 64 2c 20 68 6f 77 65  ot allowed, howe
2ae60 76 65 72 2e 20 20 41 20 66 61 6c 73 65 20 70 6f  ver.  A false po
2ae70 73 69 74 69 76 65 20 6d 61 79 20 72 65 73 75 6c  sitive may resul
2ae80 74 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 63 6f 72  t.** in an incor
2ae90 72 65 63 74 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a  rect answer..**.
2aea0 2a 2a 20 54 65 72 6d 73 20 6f 66 20 70 20 74 68  ** Terms of p th
2aeb0 61 74 20 61 72 65 20 6d 61 72 6b 65 64 20 77 69  at are marked wi
2aec0 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28  th EP_FromJoin (
2aed0 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74 20 63  and hence that c
2aee0 6f 6d 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ome from.** the 
2aef0 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2af00 73 65 73 20 6f 66 20 4c 45 46 54 20 4a 4f 49 4e  ses of LEFT JOIN
2af10 53 29 20 61 72 65 20 65 78 63 6c 75 64 65 64 20  S) are excluded 
2af20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 73 69  from the analysi
2af30 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
2af40 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
2af50 20 63 68 65 63 6b 20 69 66 20 61 20 4c 45 46 54   check if a LEFT
2af60 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 63 6f 6e   JOIN can be con
2af70 76 65 72 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 61  verted into.** a
2af80 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e  n ordinary JOIN.
2af90 20 20 54 68 65 20 70 20 61 72 67 75 6d 65 6e 74    The p argument
2afa0 20 69 73 20 74 68 65 20 57 48 45 52 45 20 63 6c   is the WHERE cl
2afb0 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 57 48  ause.  If the WH
2afc0 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 72 65  ERE.** clause re
2afd0 71 75 69 72 65 73 20 74 68 61 74 20 73 6f 6d 65  quires that some
2afe0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72   column of the r
2aff0 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68  ight table of th
2b000 65 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62  e LEFT JOIN.** b
2b010 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  e non-NULL, then
2b020 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63   the LEFT JOIN c
2b030 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63 6f 6e  an be safely con
2b040 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 0a 2a  verted into an.*
2b050 2a 20 6f 72 64 69 6e 61 72 79 20 6a 6f 69 6e 2e  * ordinary join.
2b060 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2b070 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c  xprImpliesNonNul
2b080 6c 52 6f 77 28 45 78 70 72 20 2a 70 2c 20 69 6e  lRow(Expr *p, in
2b090 74 20 69 54 61 62 29 7b 0a 20 20 57 61 6c 6b 65  t iTab){.  Walke
2b0a0 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
2b0b0 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65 73  llback = implies
2b0c0 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e  NotNullRow;.  w.
2b0d0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2b0e0 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  = 0;.  w.xSelect
2b0f0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
2b100 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20   w.eCode = 0;.  
2b110 77 2e 75 2e 69 43 75 72 20 3d 20 69 54 61 62 3b  w.u.iCur = iTab;
2b120 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2b130 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
2b140 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
2b150 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
2b160 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2b170 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
2b180 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
2b190 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65   walker.** to de
2b1a0 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78  termine if an ex
2b1b0 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
2b1c0 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65 66  evaluated by ref
2b1d0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a  erence to the.**
2b1e0 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74   index only, wit
2b1f0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64  hout having to d
2b200 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 74  o a search for t
2b210 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2b220 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  .** table entry.
2b230 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70    The IdxCover.p
2b240 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68 65  Idx field is the
2b250 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65   index.  IdxCove
2b260 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65  r.iCur.** is the
2b270 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
2b280 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  table..*/.struct
2b290 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e   IdxCover {.  In
2b2a0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f  dex *pIdx;     /
2b2b0 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
2b2c0 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76  e tested for cov
2b2d0 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69  erage */.  int i
2b2e0 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  Cur;        /* C
2b2f0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
2b300 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65   the table corre
2b310 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
2b320 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  index */.};../*.
2b330 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
2b340 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65 66  if there are ref
2b350 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
2b360 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20  ns in table .** 
2b370 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2b380 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62  over->iCur can b
2b390 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e  e satisfied usin
2b3a0 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70  g the index.** p
2b3b0 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
2b3c0 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74  ver->pIdx..*/.st
2b3d0 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64 78  atic int exprIdx
2b3e0 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  Cover(Walker *pW
2b3f0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2b400 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
2b410 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
2b420 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61     && pExpr->iTa
2b430 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
2b440 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a  pIdxCover->iCur.
2b450 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c     && sqlite3Col
2b460 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b  umnOfIndex(pWalk
2b470 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
2b480 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43  >pIdx, pExpr->iC
2b490 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20  olumn)<0.  ){.  
2b4a0 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2b4b0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
2b4c0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
2b4d0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2b4e0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2b4f0 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  Determine if an 
2b500 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61  index pIdx on ta
2b510 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
2b520 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69  iCur contains wi
2b530 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  ll.** the expres
2b540 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74  sion pExpr.  Ret
2b550 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
2b560 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72  index does cover
2b570 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2b580 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  on and false if 
2b590 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
2b5a0 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20  sion references 
2b5b0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  table columns.**
2b5c0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f   that are not fo
2b5d0 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78  und in the index
2b5e0 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20   pIdx..**.** An 
2b5f0 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61  index covering a
2b600 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61  n expression mea
2b610 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ns that the expr
2b620 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a  ession can be.**
2b630 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67   evaluated using
2b640 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20   only the index 
2b650 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76 69  and without havi
2b660 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ng to lookup the
2b670 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
2b680 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a  g table entry..*
2b690 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2b6a0 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28  rCoveredByIndex(
2b6b0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
2b6c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
2b6d0 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64  dex to be tested
2b6e0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
2b6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b700 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
2b710 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  or the correspon
2b720 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ding table */.  
2b730 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2b740 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2b750 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 75   that might be u
2b760 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65  sed for coverage
2b770 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20   */.){.  Walker 
2b780 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78 43  w;.  struct IdxC
2b790 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d  over xcov;.  mem
2b7a0 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
2b7b0 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43  f(w));.  xcov.iC
2b7c0 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f  ur = iCur;.  xco
2b7d0 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  v.pIdx = pIdx;. 
2b7e0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2b7f0 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b   = exprIdxCover;
2b800 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72  .  w.u.pIdxCover
2b810 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69   = &xcov;.  sqli
2b820 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
2b830 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e  pExpr);.  return
2b840 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f   !w.eCode;.}.../
2b850 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
2b860 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2b870 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  g structure is u
2b880 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20  sed by the tree 
2b890 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75  walker.** to cou
2b8a0 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  nt references to
2b8b0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69   table columns i
2b8c0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  n the arguments 
2b8d0 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67  of an .** aggreg
2b8e0 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e  ate function, in
2b8f0 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
2b900 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ent the.** sqlit
2b910 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72  e3FunctionThisSr
2b920 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  c() routine..*/.
2b930 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
2b940 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
2b950 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74  c;   /* One part
2b960 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75  icular FROM clau
2b970 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71  se in a nested q
2b980 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  uery */.  int nT
2b990 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  his;       /* Nu
2b9a0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2b9b0 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
2b9c0 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69   pSrcList */.  i
2b9d0 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20  nt nOther;      
2b9e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
2b9f0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
2ba00 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d  ns in other FROM
2ba10 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a   clauses */.};..
2ba20 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
2ba30 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
2ba40 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e  nces to columns.
2ba50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
2ba60 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b  xprSrcCount(Walk
2ba70 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2ba80 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20  r *pExpr){.  /* 
2ba90 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74  The NEVER() on t
2baa0 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69  he second term i
2bab0 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74 65  s because sqlite
2bac0 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
2bad0 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61  sSrc().  ** is a
2bae0 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66  lways called bef
2baf0 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  ore sqlite3ExprA
2bb00 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2bb10 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20  () and so the.  
2bb20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61  ** TK_COLUMNs ha
2bb30 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
2bb40 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54  converted into T
2bb50 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49  K_AGG_COLUMN.  I
2bb60 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75  f.  ** sqlite3Fu
2bb70 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
2bb80 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66 66  c() is used diff
2bb90 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66  erently in the f
2bba0 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20  uture, the.  ** 
2bbb0 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65  NEVER() will nee
2bbc0 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e  d to be removed.
2bbd0 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
2bbe0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
2bbf0 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f  | NEVER(pExpr->o
2bc00 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
2bc10 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
2bc20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43 6f      struct SrcCo
2bc30 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  unt *p = pWalker
2bc40 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20  ->u.pSrcCount;. 
2bc50 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
2bc60 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
2bc70 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20  int nSrc = pSrc 
2bc80 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30  ? pSrc->nSrc : 0
2bc90 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2bca0 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSrc; i++){.   
2bcb0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
2bcc0 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d  able==pSrc->a[i]
2bcd0 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  .iCursor ) break
2bce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2bcf0 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  i<nSrc ){.      
2bd00 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20  p->nThis++;.    
2bd10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
2bd20 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a  nOther++;.    }.
2bd30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
2bd40 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
2bd50 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66  .** Determine if
2bd60 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75   any of the argu
2bd70 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78  ments to the pEx
2bd80 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65  pr Function refe
2bd90 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73  rence.** pSrcLis
2bda0 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  t.  Return true 
2bdb0 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73  if they do.  Als
2bdc0 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66  o return true if
2bdd0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   the function.**
2bde0 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74   has no argument
2bdf0 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f  s or has only co
2be00 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
2be10 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
2be20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65  if pExpr.** refe
2be30 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62  rences columns b
2be40 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f  ut not columns o
2be50 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69  f tables found i
2be60 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69  n pSrcList..*/.i
2be70 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  nt sqlite3Functi
2be80 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45 78  onUsesThisSrc(Ex
2be90 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69  pr *pExpr, SrcLi
2bea0 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20  st *pSrcList){. 
2beb0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72   Walker w;.  str
2bec0 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74  uct SrcCount cnt
2bed0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
2bee0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
2bef0 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78 45  NCTION );.  w.xE
2bf00 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
2bf10 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e  prSrcCount;.  w.
2bf20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2bf30 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43  = 0;.  w.u.pSrcC
2bf40 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63  ount = &cnt;.  c
2bf50 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69  nt.pSrc = pSrcLi
2bf60 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20  st;.  cnt.nThis 
2bf70 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65  = 0;.  cnt.nOthe
2bf80 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  r = 0;.  sqlite3
2bf90 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c  WalkExprList(&w,
2bfa0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
2bfb0 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e  ;.  return cnt.n
2bfc0 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f  This>0 || cnt.nO
2bfd0 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ther==0;.}../*.*
2bfe0 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
2bff0 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
2c000 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61  nfo->aCol[] arra
2c010 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
2c020 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
2c030 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
2c040 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
2c050 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
2c060 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
2c070 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43   int addAggInfoC
2c080 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64  olumn(sqlite3 *d
2c090 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
2c0a0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
2c0b0 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c  Info->aCol = sql
2c0c0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
2c0d0 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20  e(.       db,.  
2c0e0 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
2c0f0 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
2c100 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c  pInfo->aCol[0]),
2c110 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
2c120 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  nColumn,.       
2c130 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
2c140 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
2c150 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
2c160 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
2c170 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61  fo->aFunc[] arra
2c180 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
2c190 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
2c1a0 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
2c1b0 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
2c1c0 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
2c1d0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
2c1e0 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46   int addAggInfoF
2c1f0 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  unc(sqlite3 *db,
2c200 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
2c210 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
2c220 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69  fo->aFunc = sqli
2c230 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
2c240 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20  (.       db, .  
2c250 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e       pInfo->aFun
2c260 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  c,.       sizeof
2c270 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  (pInfo->aFunc[0]
2c280 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
2c290 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->nFunc,.       
2c2a0 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
2c2b0 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
2c2c0 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78   This is the xEx
2c2d0 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  prCallback for a
2c2e0 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49   tree walker.  I
2c2f0 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20  t is used to.** 
2c300 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65  implement sqlite
2c310 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2c320 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
2c330 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2c340 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
2c350 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
2c360 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
2c370 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
2c380 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72  Aggregate(Walker
2c390 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2c3a0 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
2c3b0 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
2c3c0 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  *pNC = pWalker->
2c3d0 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a  u.pNC;.  Parse *
2c3e0 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
2c3f0 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20  arse;.  SrcList 
2c400 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
2c410 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67  >pSrcList;.  Agg
2c420 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
2c430 20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67 67 49 6e   pNC->uNC.pAggIn
2c440 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  fo;..  assert( p
2c450 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
2c460 5f 55 41 67 67 49 6e 66 6f 20 29 3b 0a 20 20 73  _UAggInfo );.  s
2c470 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
2c480 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
2c490 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
2c4a0 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
2c4b0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2c4c0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c4d0 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
2c4e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c4f0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
2c500 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43  MN );.      /* C
2c510 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
2c520 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  he column is in 
2c530 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
2c540 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
2c550 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
2c560 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
2c570 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  uery */.      if
2c580 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73  ( ALWAYS(pSrcLis
2c590 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
2c5a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2c5b0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53  item *pItem = pS
2c5c0 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  rcList->a;.     
2c5d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
2c5e0 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
2c5f0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2c600 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2c610 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b  gInfo_col *pCol;
2c620 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2c630 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2c640 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
2c650 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2c660 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ed) );.         
2c670 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
2c680 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
2c690 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
2c6a0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
2c6b0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
2c6c0 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
2c6d0 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
2c6e0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
2c6f0 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
2c700 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
2c710 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
2c720 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
2c730 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
2c740 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
2c750 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
2c760 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
2c770 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
2c780 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
2c790 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
2c7a0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
2c7b0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2c7c0 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
2c7d0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
2c7e0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
2c7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2c800 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
2c810 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
2c820 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
2c830 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2c840 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
2c850 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
2c860 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2c870 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
2c880 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
2c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2c8a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2c8b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c8c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
2c8d0 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
2c8e0 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
2c8f0 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
2c900 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
2c910 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
2c920 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
2c930 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2c940 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
2c950 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
2c960 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
2c970 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
2c980 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
2c990 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2c9a0 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
2c9b0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
2c9c0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
2c9d0 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
2c9e0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
2c9f0 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
2ca00 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2ca20 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2ca30 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2ca40 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
2ca50 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
2ca60 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
2ca70 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
2ca80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2ca90 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
2caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
2cab0 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
2cac0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
2cad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cae0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2caf0 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
2cb00 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
2cb10 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
2cb20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
2cb30 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2cb40 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
2cb50 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2cb60 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2cb70 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
2cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb90 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2cba0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
2cbb0 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
2cbc0 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
2cbe0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2cbf0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc10 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2cc20 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
2cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2cc40 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2cc50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cc60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cc70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cc80 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2cc90 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
2cca0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2ccb0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2ccc0 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
2ccd0 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
2cce0 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
2ccf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2cd00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2cd10 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
2cd20 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
2cd30 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
2cd40 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
2cd50 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
2cd60 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
2cd70 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
2cd80 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
2cd90 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
2cda0 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
2cdb0 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
2cdc0 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
2cdd0 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
2cde0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
2cdf0 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
2ce00 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
2ce10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ce20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
2ce30 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2ce40 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2ce50 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2ce60 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
2ce70 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2ce80 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
2ce90 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
2cea0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2ceb0 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
2cec0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2ced0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
2cee0 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
2cef0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2cf00 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
2cf10 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
2cf20 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
2cf30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2cf40 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2cf50 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
2cf60 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
2cf70 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
2cf80 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
2cf90 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
2cfa0 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
2cfb0 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
2cfc0 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
2cfd0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2cfe0 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
2cff0 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
2d000 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
2d010 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
2d020 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
2d030 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2d040 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
2d050 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
2d060 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2d070 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
2d080 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
2d090 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
2d0a0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2d0b0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
2d0c0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2d0d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2d0e0 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65  rCompare(0, pIte
2d0f0 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
2d100 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
2d110 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2d120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d130 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2d140 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
2d150 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
2d160 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
2d170 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
2d180 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
2d190 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
2d1a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2d1b0 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
2d1c0 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
2d1d0 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
2d1e0 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
2d1f0 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
2d200 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d210 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
2d220 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2d230 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2d240 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2d250 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2d260 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
2d270 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
2d280 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2d290 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
2d2a0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2d2b0 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
2d2c0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2d2d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2d2e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2d2f0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
2d300 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2d310 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
2d320 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
2d330 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
2d340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d350 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
2d360 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ken, .          
2d370 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2d380 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  x.pList ? pExpr-
2d390 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
2d3a0 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
2d3b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2d3c0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
2d3d0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2d3e0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2d3f0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
2d400 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2d410 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2d420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2d430 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2d440 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
2d450 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2d460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d470 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
2d480 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
2d490 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
2d4a0 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
2d4b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2d4c0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2d4d0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2d4e0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
2d4f0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2d500 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
2d510 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
2d520 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2d530 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
2d540 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20  gg = (i16)i;.   
2d550 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
2d560 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
2d570 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2d580 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
2d590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d5a0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2d5b0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2d5c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2d5d0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2d5e0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2d5f0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2d600 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
2d610 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
2d620 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
2d630 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
2d640 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ct);.  pWalker->
2d650 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20  walkerDepth++;. 
2d660 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2d670 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76  inue;.}.static v
2d680 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  oid analyzeAggre
2d690 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64  gatesInSelectEnd
2d6a0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2d6b0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2d6c0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2d6d0 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
2d6e0 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  .  pWalker->walk
2d6f0 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a  erDepth--;.}../*
2d700 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
2d710 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
2d720 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
2d730 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
2d740 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
2d750 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
2d760 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41  to be added to A
2d770 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  ggInfo object th
2d780 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f  at pNC->pAggInfo
2d790 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  .** points to.  
2d7a0 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  Additional entri
2d7b0 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74  es are made on t
2d7c0 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  he AggInfo objec
2d7d0 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72  t as.** necessar
2d7e0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2d7f0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2d800 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
2d810 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
2d820 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
2d830 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
2d840 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
2d850 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
2d860 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2d870 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
2d880 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
2d890 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
2d8a0 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
2d8b0 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2d8c0 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
2d8d0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2d8e0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2d8f0 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
2d900 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2d910 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2d920 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b  atesInSelectEnd;
2d930 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68  .  w.walkerDepth
2d940 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20   = 0;.  w.u.pNC 
2d950 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28  = pNC;.  assert(
2d960 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
2d970 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  0 );.  sqlite3Wa
2d980 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
2d990 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
2d9a0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2d9b0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
2d9c0 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
2d9d0 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
2d9e0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
2d9f0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2da00 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
2da10 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
2da20 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
2da30 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
2da40 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
2da50 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2da60 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
2da70 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
2da80 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
2da90 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2daa0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
2dab0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
2dac0 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
2dad0 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
2dae0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
2daf0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2db00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2db10 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2db20 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
2db30 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
2db40 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2db50 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67  a single new reg
2db60 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f  ister for use to
2db70 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72   hold some inter
2db80 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a  mediate result..
2db90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2dba0 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
2dbb0 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
2dbc0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d  Parse->nTempReg=
2dbd0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2dbe0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2dbf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
2dc00 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
2dc10 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
2dc20 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  g];.}../*.** Dea
2dc30 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
2dc40 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c  er, making avail
2dc50 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66  able for reuse f
2dc60 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
2dc70 20 70 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69   purpose..*/.voi
2dc80 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2dc90 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
2dca0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
2dcb0 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
2dcc0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2dcd0 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
2dce0 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
2dcf0 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
2dd00 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
2dd10 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
2dd20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
2dd30 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
2dd40 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
2dd50 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
2dd60 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69   registers..*/.i
2dd70 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2dd80 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
2dd90 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
2dda0 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
2ddb0 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74  f( nReg==1 ) ret
2ddc0 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65  urn sqlite3GetTe
2ddd0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2dde0 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61   i = pParse->iRa
2ddf0 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50  ngeReg;.  n = pP
2de00 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b  arse->nRangeReg;
2de10 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29  .  if( nReg<=n )
2de20 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  {.    pParse->iR
2de30 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b  angeReg += nReg;
2de40 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
2de50 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a  ngeReg -= nReg;.
2de60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d    }else{.    i =
2de70 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
2de80 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
2de90 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20  m += nReg;.  }. 
2dea0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69   return i;.}.voi
2deb0 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2dec0 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
2ded0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
2dee0 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
2def0 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
2df00 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2df10 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2df20 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75   iReg);.    retu
2df30 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  rn;.  }.  if( nR
2df40 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
2df50 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
2df60 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
2df70 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
2df80 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
2df90 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
2dfa0 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
2dfb0 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
2dfc0 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
2dfd0 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  le for reuse..*/
2dfe0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65  .void sqlite3Cle
2dff0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50  arTempRegCache(P
2e000 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
2e010 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2e020 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
2e030 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
2e040 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74  }../*.** Validat
2e050 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72  e that no tempor
2e060 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c  ary register fal
2e070 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  ls within the ra
2e080 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74  nge of.** iFirst
2e090 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69  ..iLast, inclusi
2e0a0 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ve.  This routin
2e0b0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66  e is only call f
2e0c0 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72  rom within asser
2e0d0 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
2e0e0 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
2e0f0 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71  ITE_DEBUG.int sq
2e100 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61  lite3NoTempsInRa
2e110 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2e120 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69  e, int iFirst, i
2e130 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74  nt iLast){.  int
2e140 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   i;.  if( pParse
2e150 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20  ->nRangeReg>0.  
2e160 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e   && pParse->iRan
2e170 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52  geReg+pParse->nR
2e180 61 6e 67 65 52 65 67 20 3e 20 69 46 69 72 73 74  angeReg > iFirst
2e190 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
2e1a0 52 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61 73  RangeReg <= iLas
2e1b0 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75  t.  ){.     retu
2e1c0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
2e1d0 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
2e1e0 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20  TempReg; i++){. 
2e1f0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
2e200 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72  TempReg[i]>=iFir
2e210 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54  st && pParse->aT
2e220 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74  empReg[i]<=iLast
2e230 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2e240 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2e250 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2e260 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
2e270 55 47 20 2a 2f 0a                                UG */.